掌握linux命令grep
一直忽略了 linux 中 grep 的用途,在无意间使用了几次之后,深深的被 grep 所吸引。索性查阅文档,掌握其用法。
借用《写给大家看的设计书》中的一句话:一旦能够说出什么东西的名字,就会很容易注意到它。你就会掌握它,拥有它,使它在你的控制中。
一、grep概述
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)应该算是linux系统中一个非常强大的文本检索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
这为我们在海量文档中搜索有效消息提供了便利而又高效的方式,所以快来掌握它的基本用法吧!
二、抛砖引玉
场景一:打印系统进程,并找到有效信息。
1 | ps -ef | grep 'jartto' -i |
场景二:git 中查找某个文件的369行更改纪录。
1 | git blame main.js | grep 369 |
场景三:对日志进行过滤,方便git版本回退。
1 | git log --oneline | grep 'add' |
输出:
1 | 88f81ae jartto:add image |
场景四:使用正则匹配更复杂的检测条件。
1 | echo this is a test line. | grep -o -E "[a-z]+\." |
输出:
1 | test. |
场景五:查看磁盘空间并过滤较大文件
1 | df -h |
输出:
1 | Filesystem Size Used Avail Capacity iused ifree %iused Mounted on |
假如数据很多,我们要找到占用空间较大的文件:
1 | df -h | grep 'G' -n |
输出结果:
1 | 2:/dev/disk1 112Gi 105Gi 6.3Gi 95% 27676905 1649397 94% / |
可以看到,第二行的/dev/disk1已经达到112G了,我们可以对其监控然后做相应的处理。
当然,还有很多场景,先喝下这碗开胃汤,下面我来详细说明。
三、参数介绍
我们先打出grep的用法示例,如下:
1 | usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]] |
嗯,看起来有些复杂,完全不知所云,翻译一下:
1 | grep [options] |
四、用法示例
这里我将列举一些日常工作中较为常见的示例,查看更为详细的命令请移步linux grep命令。
显示所有以d开头的文件中包含 test的行:
1 | grep 'test' d* |
显示在aa,bb,cc文件中匹配test的行:
1 | grep 'test' aa bb cc |
显示所有包含每个字符串至少有5个连续小写字符的字符串的行:
1 | grep ‘[a-z]\{5\}’ aa |
在’/usr/src/Linux/’目录下搜索带字符串’log’的文件:
1 | grep log /usr/src/Linux/* |
查看test文件,查询出包含a,b字母的结果:
1 | more test.txt | grep '[a-b]' |
说明:将文件读成流,然后grep后正则匹配,输出结果。
查找js中包含log字符串的文件:
1 | grep 'log' *.js |
显示所有匹配’jartto’的行和行号:
1 | ps -ef | grep -n 'jartto' |
输出结果:
1 | 272: 501 10861 92770 0 12:16下午 ttys005 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn -n jartto |
如果加上参数i,则忽略匹配字符串的大小写,如下:
1 | ps -ef | grep -in 'jartto' |
输出结果:
1 | 262: 501 93853 84378 0 11216 ttys000 0:00.12 /Users/iTerm.app/Contents/MacOS/iTerm2 --server login -fp Jartto |
当然,还可以反向输出,详见参数v,如下:
1 | ps -ef | grep -inv 'jartto' |
说明:-v过滤掉了忽略大小写匹配到的数据。
不匹配行首为test的行:
1 | grep '^[^test]' test.log |
下面还有一些有意思的命令行参数:
1 | grep -i pattern files :不区分大小写地搜索。默认情况区分大小写, |
这里还有些用于搜索的特殊符号:
1 | # \< 和 \> 分别标注单词的开始与结尾 |
五、总结
零零散散的举了好多例子,当然,grep的用法可不仅仅局限于此。大家如果感兴趣的话,可以看看下面的参考文档,这里就不细说了。