【Linux文本处理三剑客-grep、awk、sed】

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”。
掌握这三个工具将极大地增强你在命令行上处理文本数据的能力。
在这里插入图片描述

  • 40
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天Aileft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值