grep, awk, 和 sed 是三个强大的文本处理工具,在Linux系统中广泛使用。每个工具都有其独特的特性和用法,下面我会对每一个工具进行简要的介绍和说明。
1.grep
grep 是一个用于模式搜索的工具,它可以在文件或者标准输入中搜索包含特定模式的行并输出。模式可以是简单的字符串,也可以是复杂的正则表达式。
基本用法:
grep [options] pattern [file...]
1.1 grep参数:
-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。
1.2 grep示例
1.2.1 基本文本搜索
grep "text" file.txt # 在 file.txt 中搜索包含 "text" 的行。
这里只匹配出了带text的行
1.2.2 使用锚点匹配行的开始和结束
grep "^text" file.txt # 在 file.txt 中搜索以 "text" 开始的行。
这里只会匹配到file.txt中开头是text的行
grep "text$" file.txt # 匹配text结束的行
1.2.3 在 file.txt 中搜索包含 “t” 后跟零个或多个 “e”,然后是 “xt” 的行。
在使用扩展正则表达式时,可以使用 +:
grep -E "te+xt" file.txt
1.2.4 在 file.txt 中搜索包含 “t” 后跟一个或多个 “e”,然后是 “xt” 的行。
grep "te\{2\}xt" file.txt # 使用 {} 指定前一个字符的精确出现次数
1.2.5 在扩展正则表达式中,你可以使用圆括号对模式进行分组,以便与 |、*、+ 以及 {} 一起使用。
grep -E "(text|pattern)+" file.txt # 在 file.txt 中搜索包含一个或多个 "text" 或 "pattern" 的行。
1.2.6 使用 \d, \w, \s(需要 grep -P)
当你需要更复杂的正则表达式支持时,如 \d 匹配数字,\w 匹配单词字符,\s 匹配空白符,你可以使用 grep 的 -P 选项,它支持 Perl 兼容正则表达式(PCRE)。
1.2.7 -i(忽略大小写)
使搜索不区分大小写。
grep -i "pattern" file.txt
1.2.8 -v(反向匹配)
仅显示不匹配给定模式的行。
grep -v "pattern" file.txt
这里只会匹配小写的‘pattern’的行,大写的是不会包含进去
1.2.9 -c(计数)
统计匹配模式的行数。
grep -c "pattern" file.txt
1.2.10 -n(显示行号)
在每个匹配的行前显示行号。
grep -n "pattern" file.txt
1.2.11 -r(递归搜索)
递归地搜索指定目录下的所有文件。
grep -r "pattern" /path/to/directory
1.2.12 -F(固定字符串搜索)
按固定字符串而不是正则表达式搜索。
grep -F "pattern" file.txt
这个命令会将 “pattern” 视为固定字符串,而不是正则表达式。
1.2.13 -m NUM(匹配计数)
仅匹配文件中的前 NUM 行。
grep -m 5 "pattern" file.txt
这个命令会显示 file.txt 中前五个匹配 “pattern” 的行。
2. awk
awk 是一种编程语言,也是一个强大的文本处理工具,它在 Linux 和 Unix 系统中被广泛使用。awk 适合进行模式扫描和处理,特别是对于列式数据。以下是一些常见的 awk 用法和示例。
2.1 打印文件内容
awk '{ print }' file.txt
这将打印 file.txt 中的所有内容,等同于 cat file.txt。
2.2 打印特定字段
awk '{ print $1 }' file.txt
打印 file.txt 每一行的第一个字段(字段默认由空白字符分隔)。
2.3 汇总字段值
awk '{ sum += $1 } END { print sum }' file.txt
这将累加 file.txt 中每一行的第一个字段值,并在最后打印总和。
2.4 按条件过滤并打印
awk '$1 > 100' file.txt
仅打印 file.txt 中第一个字段值大于 100 的行。
2.5 打印行号
awk '{ print NR, $0 }' file.txt
这将打印文件的每一行及其行号。
2.6 文本替换并输出到文件
awk '{ gsub(/old/, "new"); print }' file.txt > out.txt
2.7 使用内置变量
Awk命令还提供了许多内置函数,可以用于字符串操作、数学计算等。下面的例子演示了如何使用内置函数计算文件中所有数字的总和:
`awk '{sum += $1} END {print "Sum:", sum}' data.txt`
2.8 格式化输出
awk 'BEGIN { printf "%-10s %s\n", "Name", "Address" } { printf "%-10s %s\n", $1, $2 }' file.txt
这将以格式化的方式打印 “Name” 和 “Address” 标题,接着打印每一行的第一和第二字段。
3.SED
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。它以一次处理一行数据的方式工作,并且通常用于管道操作中。以下是 sed 的一些常见用法和示例:
3.1 替换文本
sed 's/old/new/' file.txt
这将在 file.txt 的每一行中替换第一次出现的 “old” 为 “new”。
3.2 全局替换
sed 's/old/new/g' file.txt
这不仅替换每行中第一次出现的 “old”,而是替换每一次出现的 “old”。
3.3 替换指定行
sed '2 s/old/new/' file.txt
3.4. 删除行
sed '3 d' file.txt
删除 file.txt 中的第三行。
3.5 将结果输出到文件
sed 's/old/new/g' file.txt > output.txt
将替换操作的结果输出到 output.txt 文件中。
3.6 原地编辑文件(会更改源文件)
sed -i 's/old/new/g' file.txt
注意:使用 -i 参数可以直接在源文件上进行操作,替换所有 “old” 为 “new”。
3.7 追加(a)、插入(i)和更改(c)文本
sed '4 a This is a new line' file.txt
在文件 file.txt 的第四行之后追加一行 “This is a new line”。
3.8 在文件 file.txt 的第四行之前插入一行 “This is a new line”。
sed '4 c This is a new line' file.txt
替换文件 file.txt 的第四行内容为 “This is a new line”。
3.9 使用正则表达式
sed -n '/pattern/p' file.txt
打印所有包含 “pattern” 的行。
3.10 多点编辑
sed -e 's/old/new/' -e 's/start/end/' file.txt
同时进行多个编辑操作,这里替换 “old” 为 “new”,并且替换 “start” 为 “end”。
3.11 从文件中读取脚本执行
sed -f test.sed file.txt
4. 总结:
grep
用途:搜索特定模式(可以是正则表达式)并输出匹配的行。
主要特点:
支持基本和扩展的正则表达式。
可以递归地搜索目录。
支持多文件搜索。
包含多种实用选项,如忽略大小写 (-i),计数匹配行 (-c),只显示文件名 (-l),反转匹配 (-v) 等。
awk
用途:是一种编程语言,用于数据提取和报告生成。
主要特点:
擅长按列处理数据,字段默认由空白字符分隔。
支持内置变量和函数,如行号 (NR),字段数 (NF),计算函数等。
允许对数据进行复杂的操作,支持条件语句和循环。
可以使用模式匹配来选择性地执行动作。
sed
用途:流编辑器,用于基于模式的文本转换。
主要特点:
主要用于文本替换、删除、插入和提取。
支持基本的正则表达式。
可以原地编辑文件 (-i) 实现直接更改源文件。
虽然功能强大,但一般用于较为简单的文本操作
组合使用:
在实际应用中,grep,awk 和 sed 常常结合使用来完成复杂的文本处理任务。例如,你可以先用 grep 过滤出包含特定模式的行,然后用 awk 来处理这些行,并用 sed 进行最终的文本替换。
grep "pattern" file.txt | awk '{print $2}' | sed 's/abc/def/'
这个管道命令首先会从 file.txt 中找到所有包含 “pattern” 的行,然后提取这些行的第二个字段,最后将这些字段中的 “abc” 替换为 “def”。
掌握这三个工具将极大地增强你在命令行上处理文本数据的能力。