【Linux 文本处理三剑客:grep、sed、awk 深度解析与实战指南】

一、 grep

$ grep -[选项] '要查找的字符串或正则表达式' [文件]

1. 常用选项

  • -i:忽略大小写进行搜索
  • -e :指定查找内容,可以跟多个,类似于’查找内容1’|‘查找内容2’
  • -v:显示不匹配模式的行
  • -c : 计算找到符合行的次数
  • -w:精确查找,只能输出完全匹配的内容。类似于\b要查的内容\b
  • -n:在输出结果中显示行号
  • -r:递归搜索目录下的所有文件
  • -lr: 以长文本格式显示文件名
  • -E:使用正则表达式查找

2. 搜索模式

  • 字符串模式:直接输入要搜索的字符串,如 grep "apple" fruits.txt,会查找 fruits.txt 中包含字符串 apple 的行。
  • 正则表达式模式:grep 支持使用正则表达式进行更灵活的搜索。例如,grep "[0-9]" file.txt 会搜索 file.txt 中包含任意数字的行;grep "a.*b" file.txt 会搜索以 a 开头,中间包含任意字符,以 b 结尾的行。

二、 sed

sed(Stream Editor)是 Linux 系统中强大的文本处理工具,可对文本进行替换、删除、插入、提取等操作。它逐行处理输入,高效且灵活。sed是一种流编辑器,处理时会把当前处理的行存储在临时缓存区,也就是“模式空间”中,接着sed命令处理缓存区中内容,再将处理好的本行内容送往屏幕。按行处理,不断重复,直至文件末尾
sed命令并不会直接在文件里生效,仅打印出标准输出,只有参加了-i参数,才会改变原文件内容。
sed [选项] '生效的行命令' [文件]

1. 常用选项

  • -e:直接在命令行模式上进行sed动作编辑。同时也允许多个编辑命令,例如:sed -e 's/hello/hi/' -e 's/world/earth/' file.txt会先将hello替换为hi,再将world替换为earth
  • -n:静默模式,只显示被处理的行
  • -i:直接修改文件内容,而不是输出到标准输出。例如,sed -i 's/old/new/g' file.txt会直接将file.txt中的old替换为new,而不是仅输出结果,对文本不做修改。
    (-i后若还有参数,如-ie,除了修改原文件text.txt,默认会生成备份文件text.txte)
  • -f :将sed的动作写在一个文件内,用-f filename执行sed动作

2. 常用命令

    • a (append) 结尾加入 sed '2a\插入的文本' file.txt # 在第2行后插入
    • i (insert) 开头加入 sed '2i\插入的文本' file.txt # 在第2行前插入
    • d (delete) 删除行 sed '行号或范围d'
      • sed '3d' file.txt 删除第三行
      • sed '2,5d' file.txt 删除2到5行
    • c (copy) 覆盖行
    • s (substitute) 局部替换 's/new/old/g' # g 代表全局修改,也可使用其它修饰符,如 i 忽略大小写
    • p (print) 打印模块的行
      sed -e '1p' 'text.txt' #会打印两遍第一行,缓存区输出一行,执行命令一行
      sed -n '1p' 'text.txt' #静默输出读入缓存区内容,仅按命令输出内容
      sed -n '/error/p' file.txt #打印包含 error 的行

3. 正则表达式

  • 替换所有数字:echo "123abc" | sed 's/[0-9]//g' # 输出:abc
  • 提取邮箱:echo "Email: [email protected]" | sed -n 's/.*\([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]\{2,\}\).*/\1/p'

4. 分组和引用

使用 \ ( 和 \ )分组,通过 \1、\2 引用分组内容。

  • 交换 hello world 为 world hello:echo "hello world" | sed 's/\(hello\) \(world\)/\2 \1/' # 输出:world hello

5. 多行处理

  • N:将下一行合并到当前行。
  • P:打印模式空间的第一行。
  • D:删除模式空间的第一行。
    合并连续的两行:echo -e "line1\nline2\nline3" | sed ':a;N;$!ba;s/\n/ /' # 输出:line1 line2 line3

三、 awk

awk '模式 { 操作 }' 文件名

  • 模式:用于匹配文本行(如正则表达式、条件表达式)。
  • 动作:对匹配的行执行的操作(如打印、计算)。
  • 文件:待处理的文件(可省略,通过标准输入提供)。

1. 作用

awk 是一种强大的文本处理工具和编程语言,主要用于在命令行或脚本中处理结构化的文本数据(如日志、表格数据等)。它擅长对文本进行格式化、筛选、计算和生成报告等操作。

2. 内置变量

  • $0:当前处理的整行文本。
  • $1, $2, …, $n:当前行的第 1 到第 n 个字段(以空格或制表符分隔)。
  • NF:当前行的字段数量。
  • NR:当前处理的行号。
  • FS:输入字段分隔符(默认是空格或制表符)。
  • OFS:输出字段分隔符(默认是空格)。

3. 字段分隔符 -F

  • 默认情况下,awk 使用空格或制表符分隔字段,使用 -F 更换分割字段
  • awk -F':' '{ print $1, $3 }' /etc/passwd # 按冒号分割,打印第1和第3字段

4. 常见用法

  • 打印特定字段 :"Name Age City" | awk '{print $2}'#输出 Age
  • 条件过滤: echo -e "a 5\nb 15\nc 8" | awk '$2 > 10 {print $1 }' #输出 b
  • 数学计算:echo -e "1\n2\n3" | awk '{ sum += $1} END { print sum}' #输出6
  • 格式化输出
# 按列对齐输出
echo -e "Alice 25\nBob 30" | awk '{ printf "%-10s %d\n", $1, $2 }'
# 输出:
# Alice      25
# Bob        30

4.1 格式化参数:

  • %-10s:
    • -:左对齐(默认右对齐)。
    • 10:宽度为 10 个字符。
    • s:字符串类型。
  • %d:
    • d:十进制整数类型。

4.2 与 print 的区别:

  • print:直接输出字段,用空格分隔,自动换行。
  • printf:需手动指定格式和分隔符,不自动换行(需显式添加 \n)。

4.3 字段分隔符:

  • 默认情况下,awk 使用空格或制表符分隔字段,因此输入中的 Alice 25 被拆分为两个字段

5. 高级用法

5.1 内置函数

  1. 字符串函数
    【Linux 文本处理三剑客:grep、sed、awk 深度解析与实战指南】_第1张图片

  2. 数学函数
    【Linux 文本处理三剑客:grep、sed、awk 深度解析与实战指南】_第2张图片

  3. 时间函数
    【Linux 文本处理三剑客:grep、sed、awk 深度解析与实战指南】_第3张图片

  4. 文件与环境函数
    【Linux 文本处理三剑客:grep、sed、awk 深度解析与实战指南】_第4张图片

  5. 其他函数
    【Linux 文本处理三剑客:grep、sed、awk 深度解析与实战指南】_第5张图片

5.2 条件语句

echo -e "a 5\nb 15" | awk '{ if ($2 > 10) print $1 }' # 输出:b

5.3 循环结构

# 统计每个单词出现的次数
echo -e "apple\nbanana\napple" | awk '{ count[$1]++ } END { for (word in count) print word, count[word] }'
# 输出:
# banana 1
# apple 2 

四、 grep、sed、awk比较

【Linux 文本处理三剑客:grep、sed、awk 深度解析与实战指南】_第6张图片

你可能感兴趣的:(【Linux 文本处理三剑客:grep、sed、awk 深度解析与实战指南】)