# grep

grep

grep 是一个很实用很实用的命令,有很多花样参数和应用场景

参数网上很多,在这里不赘述了,讲几个工作中常遇到的场景

这个命令也是传说中Linux三剑客的其中一剑了

# grep日志

例如,最近线上平台总是出问题,我知道出现问题时的日志关键字是 'XssRequestFilterImpl.java:125'

那我这样执行的话,就可以直接观测出哪个时间点出现了问题,方便统计

[root@xxxx tomcat]# grep 'XssRequestFilterImpl.java:125' bt-20200426.log 
INFO   | jvm 1    | 2020/04/26 15:11:57 | 	at xxxx.XssRequestFilterImpl.filterRequest(XssRequestFilterImpl.java:125)
INFO   | jvm 1    | 2020/04/26 16:13:19 | 	at xxxx.XssRequestFilterImpl.filterRequest(XssRequestFilterImpl.java:125)
INFO   | jvm 1    | 2020/04/26 18:21:23 | 	at xxxx.XssRequestFilterImpl.filterRequest(XssRequestFilterImpl.java:125)
INFO   | jvm 1    | 2020/04/26 18:21:30 | 	at xxxx.XssRequestFilterImpl.filterRequest(XssRequestFilterImpl.java:125)
INFO   | jvm 1    | 2020/04/26 18:22:53 | 	at xxxx.XssRequestFilterImpl.filterRequest(XssRequestFilterImpl.java:125)
INFO   | jvm 1    | 2020/04/26 18:22:58 | 	at xxxx.XssRequestFilterImpl.filterRequest(XssRequestFilterImpl.java:125)
INFO   | jvm 1    | 2020/04/26 21:04:03 | 	at xxxx.XssRequestFilterImpl.filterRequest(XssRequestFilterImpl.java:125)
[root@xxxx tomcat]# 

# grep递归

新上手一个系统,光配置文件就一大堆,想查某一个配置和哪些配置关联

这个递归查询命令,就比较实用了,例如我想查查这个8443都在哪些配置文件出现

grep -rn '8443' *

或者指定文件类型

grep -rn '8443' *.properties

就可以去下面这两个文件直接更改试试,看看是否生效了

[root@xxxx config]# grep -rn '8443' *
config.properties:188:appserver.https.portnumber=8443
tomcat/conf/server.xml:78:               redirectPort="8443"/>
tomcat/conf/server.xml:89:    <!-- Direct HTTPS connector on port 8443. For standalone installations and direct application server use -->
tomcat/conf/server.xml:70:    <Connector port="8443"

# grep条件

有的时候你想多查询几个条件,这里说一下与条件和或条件

或条件,-E参数使用

ll |grep -E 'f|k'

与条件多个grep即可

ll |grep k |grep f 

TIP

【ll |grep k |grep f】 命令中的 【|】 并不只是对grep有效

【|】这个管道符,实际上是linux的与条件,

专业的描述:把前一个命令得到的结果,当作是后一个命令的输入

下方是查询结果

[root@xxxx zyttest]# ll
total 0
-rw-r--r-- 1 root root 0 Apr 27 21:44 fb.txt
-rw-r--r-- 1 root root 0 Apr 27 21:44 fff.txt
-rw-r--r-- 1 root root 0 Apr 27 21:45 fk.txt
-rw-r--r-- 1 root root 0 Apr 27 21:44 kkk.txt
[root@xxxx zyttest]# ll |grep -E 'f|k'
-rw-r--r-- 1 root root 0 Apr 27 21:44 fb.txt
-rw-r--r-- 1 root root 0 Apr 27 21:44 fff.txt
-rw-r--r-- 1 root root 0 Apr 27 21:45 fk.txt
-rw-r--r-- 1 root root 0 Apr 27 21:44 kkk.txt
[root@xxxx zyttest]# ll |grep k |grep f 
-rw-r--r-- 1 root root 0 Apr 27 21:45 fk.txt

# grep反向查询

如果我正在tail一个日志,但是总出现一堆垃圾信息

那么可以使用 grep -v 给反向掉

grep -v

例如我只想查询LOG级别在DEBUG之外的,因为DEBUG太多了,影响观测

tail -f stdout-stderr-20200427.log |grep -v 'DEBUG'

再复杂的一些的,就得现用现写了,而且都得是结合其他命令配合使用的

过于复杂的文本分析,如果日志文件不大的话,我建议直接down到本地拿文本编辑器处理了

不过grep还是用的越6越好,一点坏处没有