Linux 文本处理三剑客:grep、sed 和 awk
发布时间:2024-01-18 16:46:32
awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。Linux 系统中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。即便不熟悉这个命令,应该大多数同学也用过查询进程的命令:这就是 grep 的一个基本用法,从所有进程中搜索某个进程。
- -A<行数 x>:除了显示符合范本样式的那一列之外,并显示该行之后的 x 行内容。
- -B<行数 x>:除了显示符合样式的那一行之外,并显示该行之前的 x 行内容。
- -C<行数 x>:除了显示符合样式的那一行之外,并显示该行之前后的 x 行内容。
- -i --ignore-case #忽略字符大小写的差别。
- -v:显示不被 pattern 匹配到的行,相当于[^] 反向匹配
前三个 A、B、C 参数很容易理解,举个栗子,假设我们有一个文件,文件名是 test,内容是从 1 到 9,每个数字一行:-A2 7
的效果就是找到 7 ,然后输出 7 后面两行。同理,-B2 7
和-C2 7
就是找到 7 ,然后分别输出 7 前面两行和前后两行:继续,假设我们有个名叫 test 的文件内容如下:grep -c
命令的作用就是输出匹配到的行数,比如我们想找包含aaa
的有几行,一眼就能看出来有两行,第一行和第三行都包含:
grep -e
命令是实现多个匹配之间的或
关系,比如我们想找包含aaaa
或者bbbb
的,显然应该返回第一行和第二行:
grep -F
相当于fgrep
命令,就是将pattern
视为固定字符串。比如搜索'aa*'
不带-F
和带上,区别如下:
可以看到第二次就找不到了,因为搜索的是 aa*
这个字符串,而不是正则表达式。grep -f 文件名
的使用方法是把后面这个文件里的内容当做pattern
。比如我们有个文件,名字是 grep.txt,然后内容是aa*
,使用方法如下:grep -i --ignore-case作用是忽略大小写。grep -n显示匹配的行号,就是多显示了个行号,不用细说。grep -o仅显示匹配到的字符串,还是用刚才的aa*距离,之前显示的都是匹配到的字符所在的整行,这个命令是只显示匹配到的字符:grep -q不打印匹配结果。刚看到这个我疑惑了半天,让你搜索字符串,你不给我结果那有啥用?然后发现还有一条很多教程没说:如果有匹配的内容则立即返回状态值 0。所以一般用在shell脚本中,在 if 判断里面。grep -v显示不被匹配到的行,相当于[^]反向匹配,最常见的还是用在查找线程的命令里,有时候会打印grep线程,可以再加上这么一个去除自己:➜ ps -ef|grep Typora
501 91616 1 0 五11上午 ?? 13:39.32 /Applications/Typora.app/Contents/MacOS/Typora
501 14814 93748 0 5:33下午 ttys002 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn Typora
➜ ps -ef|grep Typora|grep -v grep
501 91616 1 0 五11上午 ?? 13:39.32 /Applications/Typora.app/Contents/MacOS/Typora
grep -w
匹配整个单词,只有完全符合pattern
的单次才会匹配到:关于正则的高级用法就不再深入研究了,改日再统一整理。sed
sed
命令的作用是利用脚本来处理文本文件。使用方法:
- -e<script>或--expression=<script> 以选项中指定的 script 来处理输入的文本文件,这个-e可以省略,直接写表达式。
- -f<script文件>或--file=<script文件>以选项中指定的 script 文件来处理输入的文本文件。
- -n 或 --quiet 或 --silent 仅显示 script 处理后的结果。
- a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s:取代,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 。
我们先准备一个文件,名为test做测试,内容如下:增加内容
使用命令sed -e 3a\newLine testfile
这个命令的意思就是,在第三行后面追加newLine
这么一行字符,字符前面要用反斜线作区分。执行完毕之后可以看到结果:但是注意,这个只是将文字处理了,没有写入到文件里,文件里还是之前的内容。其实 a 前面是可以匹配字符串,比如我们只想在出现 Linux 的行后面追加,就可以:sed -e /Linux/a\newline test 两个斜线之间的内容是需要匹配的内容。可以看出,只有第二、第四行有Linux,所以结果如下:这里用双引号把整个表达式括起来也可以,还方便处理带空格的字符。sed -e /Linux/a\newline test等效于sed "/Linux/a newline" test跟 a 类似,sed 3i\newline test是在第三行前面插入newline:sed /Linux/i\newline test
是在所有匹配到Linux
的行前面插入: