Linux文本三剑客(一)——grep和sed
1.1 什么是grep和egrep
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
egrep = grep -E:扩展的正则表达式 (除了< , > , \b 使用其他正则都可以去掉\)
1.2 使用grep
1.2.1 命令格式
grep` `[option] pattern ``file
1.2.2 命令功能
用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。
1.2.3 命令参数
常用参数已加粗
-
-A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-
-B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
-
-C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。
-
-c:统计匹配的行数
-
-e :实现多个选项间的逻辑or 关系
-
-E:扩展的正则表达式
-
-f FILE:从FILE获取PATTERN匹配
-
-F :相当于fgrep
-
-i --ignore-case #忽略字符大小写的差别。
-
-n:显示匹配的行号
-
-o:仅显示匹配到的字符串
-
-q: 静默模式,不输出任何信息
-
-s:不显示错误信息。
-
-v:显示不被pattern 匹配到的行,相当于[^] 反向匹配
-
-w :匹配 整个单词
2.1 认识sed
sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i。
功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作
2.2 使用sed
2.2.1 命令格式
sed` `[options] ``'[地址定界] command'` `file``(s)
2.2.2 常用选项options
-
-n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
-
-e:多点编辑,对每行处理时,可以有多个Script
-
-f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
-
-r:支持扩展的正则表达式
-
-i:直接将处理的结果写入文件
-
-i.bak:在将处理的结果写入文件之前备份一份
2.2.3 地址定界
-
不给地址:对全文进行处理
-
单地址:
-
#: 指定的行
-
/pattern/:被此处模式所能够匹配到的每一行
-
-
地址范围:
-
#,#
-
#,+#
-
/pat1/,/pat2/
-
#,/pat1/
-
-
~:步进
-
sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行)
-
sed -n '2~2p' 只打印偶数行
-
2.2.4 编辑命令command
-
d:删除模式空间匹配的行,并立即启用下一轮循环
-
p:打印当前模式空间内容,追加到默认输出之后
-
a:在指定行后面追加文本,支持使用\n实现多行追加
-
i:在行前面插入文本,支持使用\n实现多行追加
-
c:替换行为单行或多行文本,支持使用\n实现多行追加
-
w:保存模式匹配的行至指定文件
-
r:读取指定文件的文本至模式空间中匹配到的行后
-
=:为模式空间中的行打印行号
-
!:模式空间中匹配行取反处理
-
s///
:
查找替换
,支持使用其它分隔符,如:
s@@@
,
s###
;
-
加g表示行内全局替换;
-
在替换时,可以加一下命令,实现大小写转换
-
\l:把下个字符转换成小写。
-
\L:把replacement字母转换成小写,直到\U或\E出现。
-
\u:把下个字符转换成大写。
-
\U:把replacement字母转换成大写,直到\L或\E出现。
-
\E:停止以\L或\U开始的大小写转换
-
2.3 sed用法演示
2.3.1 常用选项options演示
[root@along ~]# cat demo aaa bbbb AABBCCDD [root@along ~]# sed "/aaa/p" demo #匹配到的行会打印一遍,不匹配的行也会打印 aaa aaa bbbb AABBCCDD [root@along ~]# sed -n "/aaa/p" demo #-n不显示没匹配的行 aaa [root@along ~]# sed -e "s/a/A/" -e "s/b/B/" demo #-e多点编辑 Aaa Bbbb AABBCCDD [root@along ~]# cat sedscript.txt s/A/a/g [root@along ~]# sed -f sedscript.txt demo #-f使用文件处理 aaa bbbb aaBBCCDD [root@along ~]# sed -i.bak "s/a/A/g" demo #-i直接对文件进行处理 [root@along ~]# cat demo AAA bbbb AABBCCDD [root@along ~]# cat demo.bak aaa bbbb AABBCCDD
2.3.2 地址界定演示
[root@along ~]# cat demo aaa bbbb AABBCCDD [root@along ~]# sed -n "p" demo #不指定行,打印全文 aaa bbbb AABBCCDD [root@along ~]# sed "2s/b/B/g" demo #替换第2行的b->B aaa BBBB AABBCCDD [root@along ~]# sed -n "1,2p" demo #打印1-2行 aaa bbbb [root@along ~]# sed -n "/aaa/,/DD/p" demo aaa bbbb AABBCCDD [root@along ~]# sed -n "2,/DD/p" demo bbbb AABBCCDD [root@along ~]# sed "1~2s/[aA]/E/g" demo #将奇数行的a或A替换为E EEE bbbb EEBBCCDD
2.3.3 编辑命令command演示
[root@along ~]# cat demo aaa bbbb AABBCCDD [root@along ~]# sed "2d" demo #删除第2行 aaa AABBCCDD [root@along ~]# sed -n "2p" demo #打印第2行 bbbb [root@along ~]# sed "2a123" demo #在第2行后加123 aaa bbbb 123 AABBCCDD [root@along ~]# sed "1i123" demo #在第1行前加123 123 aaa bbbb AABBCCDD [root@along ~]# sed "3c123\n456" demo #替换第3行内容 aaa bbbb 123 456 [root@along ~]# sed -n "3w/root/demo3" demo #保存第3行的内容到demo3文件中 [root@along ~]# cat demo3 AABBCCDD [root@along ~]# sed "1r/root/demo3" demo #读取demo3的内容到第1行后 aaa AABBCCDD bbbb AABBCCDD [root@along ~]# sed -n "=" demo #=打印行号 1 2 3 [root@along ~]# sed -n '2!p' demo #打印除了第2行的内容 aaa AABBCCDD [root@along ~]# sed 's@[a-z]@\u&@g' demo #将全文的小写字母替换为大写字母 AAA BBBB AABBCCDD
2.4 sed高级编辑命令
(1)格式
-
h:把模式空间中的内容覆盖至保持空间中
-
H:把模式空间中的内容追加至保持空间中
-
g:从保持空间取出数据覆盖至模式空间
-
G:从保持空间取出内容追加至模式空间
-
x:把模式空间中的内容与保持空间中的内容进行互换
-
n:读取匹配到的行的下一行覆盖 至模式空间
-
N:读取匹配到的行的下一行追加 至模式空间
-
d:删除模式空间中的行
-
D:删除 当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
(2)一个案例+示意图演示
① 案例:倒序输出文本内容
[root@along ~]# cat num.txt One Two Three [root@along ~]# sed '1!G;h;$!d' num.txt Three Two One 1!G 第一行不执行G命令,从第二行开始执行 $!d 最后一行不删除
③ 总结模式空间与保持空间关系:
保持空间是模式空间一个临时存放数据的缓冲区,协助模式空间进行数据处理
(3)演示
① 显示偶数行
[root@along ~]# seq 9 |sed -n 'n;p' 2 4 6 8
② 倒序显示
[root@along ~]# seq 9 |sed '1!G;h;$!d' 9 8 7 6 5 4 3 2 1
③ 显示奇数行
[root@along ~]# seq 9 |sed 'H;n;d' 1 3 5 7 9
④ 显示最后一行
[root@along ~]# seq 9| sed 'N;D' 9
⑤ 每行之间加空行
[root@along ~]# seq 9 |sed 'G' 1 2 3 4 5 6 7 8 9
⑥ 把每行内容替换成空行
[root@along ~]# seq 9 |sed "g"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了