二、文本查看与处理
2.1 文件查看与过滤
cat
1、查看小文件内容cat 文件名
2、同时查看多个文件cat file1 file2
3、将多个文件合并成一个cat file1 file2 > merged.txt
4、在每行前面显示行号cat -n 文件名
5、显示非打印字符(如制表符、换行符)cat -A 文件名
语法:cat [options] [文件...]
options:
- -n 对所有输出行编号(包括空行)
- -b 对非空行编号
- -s 压缩连续的空行为一行
- -A 显示所有字符(包括制表符^I、行尾$等)
注意: cat适合查看短文件(几十行以内)。如果文件很大(如几百兆的日志),cat会刷屏且难以定位,此时应该用less。- 不小心
cat一个二进制文件(如cat /bin/ls)会导致终端乱码,可以用reset命令恢复 - 没有参数时,cat会等待标准输入(键盘),输入什么就输出什么,Ctrl+D结束
less
1、分页查看大文件(最常用)less 文件名
2、查看文件并显示行号less -N 文件名
3、打开文件后搜索关键词/关键词(向下搜索),?关键词(向上搜索)
语法:less [options] 文件名
常用选项与操作
- -N 显示行号
- 空格 / f 向下翻一页
- b 向上翻一页
- 回车 向下翻一行
- y 向上翻一行
- /字符串 向下搜索字符串(按 n 继续,N 反向)
- ?字符串 向上搜索
- g 跳到文件开头
- G 跳到文件末尾
- q 退出
- v 使用配置的编辑器编辑当前文件
- h 显示 less 的帮助文档
- &pattern 仅显示匹配模式的行,而不是整个文件
head
1、查看文件前 10 行(默认)head 文件名
2、查看文件前 N 行head -n 20 文件名
3、查看文件除最后 N 行外的所有行head -n -5 文件名(显示除了最后5行的内容)
4、查看多个文件head -n 3 file1 file2
语法:head [options] [文件...]
常用选项:
- -n N 显示前 N 行(N 可以是负数,表示不显示最后 N 行)
- -c N 显示前 N 个字节
注意: - 如果不指定文件,head 会从标准输入读取。
- 当查看多个文件时,head 会在每个文件输出前加上 > 文件名 < 的分隔符。
- head -n -0 会输出全部内容(因为减去0行等于全输出)。
tail
1、查看文件最后 10 行(默认)tail 文件名
2、查看文件最后 N 行tail -n 20 文件名
3、实时追踪文件新增内容(常用于查看日志)tail -f 文件名
4、从指定行号开始显示tail -n +100 文件名(从第100行开始显示到末尾)
语法:tail [options] [文件...]
常用选项:
- -n N 显示最后 N 行。+N 表示从第 N 行开始到末尾
- -f 跟随模式:文件有新内容时实时输出(按 Ctrl+C 终止)
- -F 类似 -f,但会处理文件被删除/轮转的情况(常用于日志监控)
- -c N 显示最后 N 个字节
注意: - tail -f 非常有用,例如 tail -f /var/log/messages 可以实时看系统日志。
- tail -f 不会自动退出,需要手动 Ctrl+C。若在脚本中设置超时,可以用
timeout 10 tail -f file。 - 与 cat、head 一样,不指定文件时从标准输入读取。
- tail -n +1 等价于 cat(显示所有行)。
2.2 文件处理
grep 搜索并匹配行
1、在文件中搜索字符串grep hello file.txt在文件 file.txt 中查找字符串 "hello",并打印匹配的行
2、搜索时忽略大小写grep -i "error" log.txt
3、搜索整个目录下的所有文件(递归)grep -r "error" /var/log/
4、显示匹配行的行号grep -n "error" log.txt
5、显示不匹配的行(反向匹配)grep -v "debug" log.txt
6、使用正则表达式grep "^[0-9]" file.txt(匹配以数字开头的行)
语法:grep [options] pattern [文件名...]
- -i 忽略大小写
- -v 反向匹配:显示不包含 pattern 的行
- -n 显示匹配行的行号
- -r / -R 递归搜索目录下的所有文件
- -l 只输出包含匹配的文件名,不输出行内容
- -w 匹配整个单词,而非子串
- -e 指定多个 pattern(如 grep -e "error" -e "fail")
- --color 高亮显示匹配的文本(很多发行版默认别名已加)
- -a 将二进制文件当作文本处理
注意:
grep默认使用基础正则表达式(BRE)。用-E选项可启用扩展正则(ERE),此时+、?、|、()等无需转义。- pattern 中如果包含空格或特殊字符(如
*、.),必须加引号
awk 搜索并匹配列
awk把文本一行一行读进来,自动按分隔符(默认是空格或制表符)把每一行切成多个“字段”(像表格里的列)。
1、打印文件的某一列(默认按空格/制表符分隔)awk '{print $1}' file.txt 2、指定分隔符(如冒号)打印某列awk -F: '{print $1}' /etc/passwd3、只匹配包含某模式的行awk '/error/ {print $0}' log.txt4、对某列进行数值求和awk '{sum += $3} END {print sum}' data.txt5、设置输出字段分隔符awk 'BEGIN{OFS=","} {print $1,$2}' file.txt`
在开始处理文件之前,设置输出字段分隔符(OFS)为逗号
对每一行,输出该行的第1和第2个字段
语法:awk [options] 'pattern {action}' [文件...]
常用选项与内置变量:
- -F 指定输入字段分隔符(如 -F:)
- $1, $2, ... 第1个字段、第2个字段…… $0 表示整行
- NR 当前行号
- NF 当前行的字段数
- BEGIN 在处理任何行之前执行的动作
- END 在所有行处理完之后执行的动作
注意: awk程序由pattern { action }组成,可以省略 pattern(表示每行都执行)或省略 action(表示打印整行)。- 默认分隔符是连续的空白字符(空格/制表符),
-F可以指定单个字符或正则表达式(如-F"[ ,]+")
sed
1、替换文件中第一个匹配的字符串(默认只替换每行第一个)sed 's/old/new/' file.txt
把每行第一个old替换为new
2、全局替换(一行中所有匹配)sed 's/old/new/g' file.txt
3、删除匹配的行sed '/pattern/d' file.txtsed '2,5d' file.txt删除第2到第5行
4、只打印匹配的行sed -n '/pattern/p' file.txt
5、直接修改文件(慎用)sed -i 's/old/new/g' file.txt
语法:sed [options] 'script' [文件...]
- s/old/new/ 替换(默认只替换每行第一个匹配),将old内容替换为new内容
- g 标志 全局替换(一行中所有匹配)
- d 删除行
- p 打印行(常与 -n 配合)
- -n 静默模式,不自动打印所有行
- -i 直接修改文件(危险,建议先不加 -i 测试)
- -e 执行多个脚本
注意: script是你告诉 sed 对每一行做什么操作 的指令串。多个命令可以用分号;隔开,或用-e选项添加多个sed默认只输出到屏幕,不修改原文件。-i会直接改文件,务必小心。可以备份:-i.bak。- 分隔符
/可以换成其他字符,如s|old|new|,当要替换的字符串包含/时很方便。 - 正则表达式中特殊字符需要转义,如
s/\.txt/\.md/。 - 地址范围:
sed '2,5d' file删除2-5行;sed '/start/,/end/d'删除两个模式之间的行。
cut
1、按字节位置提取cut -b 1-5 file.txt
2、按字符位置提取(中文友好)cut -c 1-5 file.txt
3、按字段提取(默认分隔符为制表符)cut -f 1,3 file.txt
4、指定分隔符提取字段cut -d: -f 1 /etc/passwd-d指定字段分隔符为冒号:,-f 1表示从/etc/passwd文件中提取第一个字段
语法:cut [options] [文件...]
- -b 按字节位置(如 -b 1,3,5 或 -b 1-5)
- -c 按字符位置(适用于多字节字符)
- -f 按字段提取(与 -d 配合)
- -d 指定字段分隔符(默认制表符)
- --complement 反向提取(显示不匹配的部分)
注意: cut -d' ' -f 2处理空格分隔时,多个空格会视为多个空字段,效果不理想。这种情况建议用 awk。- cut 不能重新排列字段顺序(只会按原顺序输出指定的列)。
- 没有指定文件时从标准输入读取。
2.3 排序统计
sort
1、按字典序排序文件行sort file.txt
2、按数字大小排序sort -n numbers.txt
3、按第2列排序sort -k2 data.txt
从第2个字段开始,一直到行尾,都作为排序的“键”(即排序依据)。也就是说,它会先比较第2字段,如果第2字段相同,再比较第3字段、第4字段……直到行尾。sort -k2,2 data.txt只以第2字段作为排序键sort -k2,-k3 data.txt二级排序,先按第2字段排,第2字段相同时再按第3字段排sort -k2,3 data.txt把第2到第3字段看作一个整体的复合键,先排第二字段,再排第三字段
4、倒序排序sort -r file.txt
5、去重并排序sort -u file.txt
语法:sort [options] [文件...]
常用选项:
- -n 按数值排序
- -r 倒序
- -u 去重(相同行只输出一次)
- -k 指定排序的键(列)
-k选项的完整格式:-k start[.pos][,end[.pos]][modifiers]start:开始字段(1-based)end:结束字段(默认到行尾).pos:字段内的字符位置(很少用)modifiers:如n(数值)、r(倒序)等
- -t 指定字段分隔符(默认空白)
- -o 将结果写入文件(可与输入文件同名)
注意: - 默认排序规则是字典序(字母顺序),数字会按字符排序(如 10 排在 2 前面),需加 -n。
- 对文本排序时注意 locale 影响(中文排序可能不同),可设置 LC_ALL=C 获得传统排序。
- sort -u 等价于 sort | uniq,但更高效。
uniq
1、去除相邻重复行(需先 sort)sort file.txt | uniq
管道符|的作用是:把左边sort file.txt的输出(排序后的所有行)直接传给右边uniq作为输入。
2、统计重复次数sort file.txt | uniq -c
3、只显示重复的行sort file.txt | uniq -d
4、只显示不重复的行sort file.txt | uniq -u
语法:uniq [options] [输入文件] [输出文件]
常用选项:
- -c 每行前面显示重复次数
- -d 只输出重复的行(出现至少两次)
- -u 只输出不重复的行
- -i 忽略大小写
- -f N 跳过前 N 个字段比较
注意: - uniq 只去除相邻的重复行,所以通常需要先 sort。
- 可以配合 sort -k 只对特定列去重:sort -k2 file | uniq -f1(跳过第一列比较)。
wc
1、统计行数wc -l file.txt
2、同时统计行、单词、字节wc file.txt
语法:wc [options] [文件...]
- -l 行数
- -w 单词数(由空白字符分隔)
- -c 字节数
- -m 字符数
- -L 最长行的长度
注意: - 不指定文件时从标准输入读取,常用于管道:ls -l | wc -l 统计文件数量。
- 多个文件时输出多行统计,最后一行显示总计。
- wc -l 统计行数时,空文件输出 0,文件末尾没有换行也不影响行数统计(按换行符计数)。