grep功能简介
有时你需要在成百上千的日志中搜索到莫一特定用户的记录;
有时你需要在一个文件中匹配多个关键字;
有时你需要筛除掉一些特定的显示;
…
你该怎么做?
1、 单个文件中搜索特定 ‘字符串’
被搜索到的字符会高亮显示,我这里显示为红色
[root@d8a4ced9-4996-52cb-a ~]#grep sk_list_app_terminal rcac.log
2022-03-08 11:56:17,933 <INFO> [log_auto.py 44] [log_front] <openapi> enter <name:'sk_list_app_terminal', token:None>
2022-03-08 11:57:17,934 <INFO> [log_auto.py 44] [log_front] <openapi> enter <name:'sk_list_app_terminal', token:None>
2022-03-08 11:58:17,932 <INFO> [log_auto.py 44] [log_front] <openapi> enter <name:'sk_list_app_terminal', token:None>
2022-03-08 11:59:17,933 <INFO> [log_auto.py 44] [log_front] <openapi> enter <name:'sk_list_app_terminal', token:None>
[root@d8a4ced9-4996-52cb-a ~]#cat rcac.log |grep sk_list_app_terminal
2022-03-08 09:46:15,334 <INFO> [log_auto.py 44] [log_front] <openapi> enter <name:'sk_list_app_terminal', token:None>
2022-03-08 09:46:19,330 <INFO> [log_auto.py 44] [log_front] <openapi> enter <name:'sk_list_app_terminal', token:None>
2022-03-08 09:46:23,330 <INFO> [log_auto.py 44] [log_front] <openapi> enter <name:'sk_list_app_terminal', token:None>
2、对多个字段进行搜索
grep -E “telnet|SSH|web|rsync|ftp|systemd|master|SNMP” 1.txt
[root@d8a4ced9-4996-52cb-a ~]# grep -E "telnet|SSH|web|rsync|ftp|systemd|master|SNMP" 1.txt
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2627/master
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 ::1:25 :::* LISTEN 2627/master
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp6 0 0 :::111 :::* 1/systemd
3、多重过滤+反向搜索grep -v
cat 1.txt|grep -v docker |grep -v qemu
注:反向过滤的意思是显示除-v 后面搜索的内容
4、不区分大小写
grep -i docker 1.txt
注:-i 是不区分大小写,比如可以搜索到DOCKEr dockeR…之类
5、对文件夹中莫些特定字段进行搜索
grep -RHn 'dfjkflfl ’ /path/forld
grep -RHn uuid:\'00b8e4e2-9b5f-11ec-ac9a-0242ac1ffd2f ./sh/
grep 选项
选项功能 | 描述 |
---|---|
-i | 忽略大小写。不区分大写和小写字符,也可以用–ignore-case指定 |
-v | 不匹配。正常情况下,grep会输出匹配行,而该选项可使grep输出不包含匹配项的所有行。也可以用–invert-match指定 |
-c | 输出匹配项数目(如果有-v选项,那就输出不匹配项的数目)而不是直接输出匹配行自身。也可以用–count指定 |
-l | 输出匹配项文件名而不是直接输出匹配行自身。也可以用–files-with-matches指定 |
-L | 与-l选项类似,但输出的是不包含匹配项的文件名。也可以用–files-without-match指定 |
-n | 在每个匹配行前面加上该行在文件内的行号。也可以用–line-number指定 |
-h | 进行多文件搜索时,抑制文件名输出。也可以用–no-filename指定 |
-H | 为每一匹配项打印文件名 |
grep
其他用法见grep -h
正则表达式匹配 (^ $ . [ ] { } - ? * + ( ) | \)
(^表以什么开头,$表以什么结尾)
[root@d8a4ced9-4996-52cb-a93c-dsh]# cat eeeee
zhidao
1zhidao2
1zhidao3
zhidao4
3zhidao
[root@d8a4ced9-4996-52cb-a93c-d sh]# grep '^zhidao$' eeeee
zhidao
[root@d8a4ced9-4996-52cb-a93c-d sh]# grep '1zhidao' eeeee
1zhidao2
1zhidao3
“.” 表示一个字符
[root@d8a4ced9-4996-52cb-a93c-d sh]# cat ey.txt
wordj
major
1major
adjor3
3adjor
adjor
[root@d8a4ced9-4996-52cb-a93c-d sh]# grep -i '^..j.r$' ey.txt
major
adjor
[root@d8a4ced9-4996-52cb-a93c-d sh]#
[]表可匹配[]中任意字符
[root@d8a4ced9-4996-52cb-a93c-d sh]# cat ey.txt
wordj
major
1major
adjor3
3adjor
adjor
[root@d8a4ced9-4996-52cb-a93c-d sh]# grep -i '^[13]..j.r$' ey.txt
1major
3adjor
grep -h '^[A-Za-z0-9]' ey.txt
{ } - ? * + ( ) | \
?:表匹配莫元素0次或1次;
*:表匹配莫元素0次或多次;
+:表匹配莫元素1次或多次;
{}:制定次数匹配莫元素;
|:或;
\:是常用的转义符,用来在正则中需要匹配一些特殊符号时使用
指定匹配次数指定项 | 含义 |
---|---|
{n} | 前面的元素恰好出现n次则匹配 |
{n,m} | 前面的元素出现的次数在n~m次之间时则匹配 |
{n,} | 前面的元素出现次数超过n次则匹配 |
{,m} | 前面的元素出现次数不超过m次则匹配 |