常用Linux 命令整理 二、文本查看与处理

常用Linux 命令整理 二、文本查看与处理

二、文本查看与处理

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.txt
sed '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,文件末尾没有换行也不影响行数统计(按换行符计数)。