linux搜索过滤--grep

时间:2022-01-25 14:02:18

  grep在服务端查询消息时经常会被使用到,这里总结几个常用,简单的命令,熟练掌握可以使查询更为高效。

  基本格式:

grep [option] pattern file

  几个重要的命令参数,这里不列举全部,只列举可能会常用的,便于快速查询:

  除了不加任何参数表示搜索符合之后的样式的内容之外,剩下的参数:

-v   --revert-match   #显示不包含匹配文本的所有行。 
-i --ignore-case #忽略字符大小写的差别。
-n --line-number #在显示符合样式的那一行之前,标示出该行的列数编号。
-c --count #计算符合样式的列数。

  举例:

[xxx@application01 yyy]$ grep -c 'mongo' nohup.out 
grep: nohup.
out: Permission denied
[xxx@application01 yyy]$ sudo grep
-c 'mongo' nohup.out
10633
[xxx@application01 yyy]$ sudo grep
-v 'not' stop.sh
#
!/bin/sh
PROCESS
=`ps -ef|grep zzz|grep -v grep|grep -v PPID|awk '{ print $2}'`
num
=`ps -ef|grep zzz|grep -v grep|wc -l`
for i in $PROCESS
do
echo
"Kill the consumer process [ $i ]"
kill
-9 $i
done
echo
"$num processes be killed"

[xxx@application01 yyy]$ sudo grep
-i ppid stop.sh
PROCESS
=`ps -ef|grep zzz|grep -v grep|grep -v PPID|awk '{ print $2}'`
[xxx@application01 yyy]$ sudo grep
-n -i ppid stop.sh
2:PROCESS=`ps -ef|grep zzz|grep -v grep|grep -v PPID|awk '{ print $2}'`

  如果将grep与正则表达式结合,可以使得该工具变得更加强大,这里记录几个常用的正则表达式,可以和grep参数配合使用:

\< #锚定单词的开始
如:
'\<grep'匹配包含以grep开头的单词的行。
\
> #锚定单词的结束
'grep\>'匹配包含以grep结尾的单词的行
^ #锚定行的开始
如:
'^grep'匹配所有以grep开头的行。
$ #锚定行的结束
如:
'grep$'匹配所有以grep结尾的行。
[] #匹配一个指定范围内的字符
    如'[Gg]rep'匹配Grep和gre

  举例:

[xxx@application01 yyy]$ sudo grep -n '\<grep' stop.sh 
2:PROCESS=`ps -ef|grep zzz|grep -v grep|grep -v PPID|awk '{ print $2}'`
3:num=`ps -ef|grep zzz|grep -v grep|wc -l`
[xxx@application01 yyy]$ sudo grep
-n '^e' stop.sh
9:echo "$num processes be killed"
[xxx@application01 yyy]$ sudo grep
-n 'i$' stop.sh
7: kill -9 $i
[xxx@application01 yyy]$ sudo grep
-n [Gg]rep stop.sh
2:PROCESS=`ps -ef|grep zzz|grep -v grep|grep -v PPID|awk '{ print $2}'`
3:num=`ps -ef|grep zzz|grep -v grep|wc -l`

  最后,如果需要将查询内容输出到文本中就可以:

[xxx@application01 yyy]$ ll
total
59976
-rwxrwxrwx 1 root root 0 Oct 19 17:20 1.txt
drwxr
-xr-x 2 root root 4096 May 31 20:46 lib
-rw-r--r-- 1 root root 39936 Jul 18 15:30 zzz.jar
-rw-r--r-- 1 root root 39792 Jun 3 14:38 zzz.jar.20160714
-rw-r--r-- 1 root root 39835 Jul 14 09:31 zzz.jar.20160718
-rw------- 1 root root 61218369 Oct 19 17:20 nohup.out
-rw-r--r-- 1 root root 275 Jun 1 15:05 stop.sh
[xxx@application01 yyy]$ sudo grep
'mongo' nohup.out >1.txt
[xxx@application01 yyy]$ ll
total
61184
-rwxrwxrwx 1 root root 1159937 Oct 19 17:20 1.txt
drwxr
-xr-x 2 root root 4096 May 31 20:46 lib
-rw-r--r-- 1 root root 39936 Jul 18 15:30 zzz.jar
-rw-r--r-- 1 root root 39792 Jun 3 14:38 zzz.jar.20160714
-rw-r--r-- 1 root root 39835 Jul 14 09:31 zzz.jar.20160718
-rw------- 1 root root 61286858 Oct 19 17:20 nohup.out
-rw-r--r-- 1 root root 275 Jun 1 15:05 stop.sh

   在实际的过滤中,很多时候我们会将无用的(或者有用的)信息删除(保留)下来,可能会涉及到多个关键字,最简单的做法就是用或的关系将各个条件并列出来。例如在日志信息中,将含有socket,session,zookeeper的信息过滤掉:

grep -Evi 'socket|session|zookeeper' validateChiqTest.log

这里的E参数以及之后的'|'即属于或操作,-i为忽略大小写,-v指将这些信息筛选不保留。