Linux 三剑客之 grep

基于正则表达式查找满足条件的行

内容检索

规则表达式
^ # 锚定行的开始 如:'^grep’匹配所有以grep开头的行。
$ # 锚定行的结束 如:‘grep$’ 匹配所有以grep结尾的行。
. # 匹配一个非换行符的字符 如:'gr.p’匹配gr后接一个任意字符,然后是p。

  • 匹配零个或多个先前字符 如:'*grep’匹配所有一个或多个空格后紧跟grep的行。

.* # 一起用代表任意字符。
# 匹配一个指定范围内的字符,如’[Gg]rep’匹配Grep和grep。
[^] # 匹配一个不在指定范围内的字符,如:‘[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
(…) # 标记匹配字符,如’(love)‘,love被标记为1。
< # 锚定单词的开始,如:’<grep’匹配包含以grep开头的单词的行。
> # 锚定单词的结束,如’grep>'匹配包含以grep结尾的单词的行。
x{m} # 重复字符x,m次,如:'0{5}'匹配包含5个o的行。
x{m,} # 重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。
x{m,n} # 重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5–10个o的行。
\w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p。
\W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b # 单词锁定符,如: '\bgrep\b’只匹配grep。

获取行 grep pattern file

[jck287213@shell.ceshiren.com ~]$ vim /tmp/1
[jck287213@shell.ceshiren.com ~]$ cat /tmp/1
a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 1
b, 2, 2
b, 3, 3
c, 1, 20
c, 2, 30
c, 3, 30
[jck287213@shell.ceshiren.com ~]$ grep a /tmp/1
a, 1, 10
a, 2, 20
a, 3, 30
[jck287213@shell.ceshiren.com ~]$ grep c /tmp/1
c, 1, 20
c, 2, 30
c, 3, 30
[jck287213@shell.ceshiren.com ~]$ grep 1 /tmp/1
a, 1, 10
b, 1, 1
c, 1, 20

[jck287213@shell.ceshiren.com ~]$ cat /tmp/1
a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 1
b, 2, 2
b, 3, 3
c, 1, 21
c, 2, 31
c, 3, 31
[jck287213@shell.ceshiren.com ~]$ grep 1 /tmp/1
a, 1, 10
b, 1, 1
c, 1, 21
c, 2, 31
c, 3, 31
[jck287213@shell.ceshiren.com ~]$ grep " 1, " /tmp/1
a, 1, 10
b, 1, 1
c, 1, 21
[jck287213@shell.ceshiren.com ~]$ grep “1” /tmp/1
a, 1, 10
b, 1, 1
c, 1, 21
c, 2, 31
c, 3, 31
[jck287213@shell.ceshiren.com ~]$ grep “1$” /tmp/1(获取以1结尾的内容)
b, 1, 1
c, 1, 21
c, 2, 31
c, 3, 31

获取内容 grep -o pattern file

[jck287213@shell.ceshiren.com ~]$ grep -o “1$” /tmp/1(只输出匹配到1结尾的数据)
1
1
1
1
[jck287213@shell.ceshiren.com ~]$ grep -o " [0-9]*1$" /tmp/1(只输出匹配到的范围0-9一个多个并且以1结尾的数据)
1
21
31
31

获取上下文 grep -A -B -C pattern file

[jck287213@shell.ceshiren.com ~]$ grep -B1 “2,” /tmp/1(匹配2,内容以及以前1行的内容)
a, 1, 10
a, 2, 20

b, 1, 1
b, 2, 2

c, 1, 21
c, 2, 31
[jck287213@shell.ceshiren.com ~]$ grep -A1 “2,” /tmp/1(匹配2,内容以及以后1行的内容)
a, 2, 20
a, 3, 30

b, 2, 2
b, 3, 3

c, 2, 31
c, 3, 31
[jck287213@shell.ceshiren.com ~]$ grep -C1 “2,” /tmp/1(匹配2,内容以及前后1行的内容)
a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 1
b, 2, 2
b, 3, 3
c, 1, 21
c, 2, 31
c, 3, 31

文件检索

*递归搜索 grep pattern -r dir/

  • 展示匹配文件名 grep -H 111 /tmp/1
  • 只展示匹配文件名 grep -l 111 /tmp/1

[jck287213@shell.ceshiren.com ~]$ grep 111 -r /tmp/demo(递归检索111内容的文件以及内容)
/tmp/demo/111:111
/tmp/demo/1:111
[jck287213@shell.ceshiren.com ~]$ grep -h 111 -r /tmp/demo (展示匹配111的文件内容,不展示文件名称)
111
111
[jck287213@shell.ceshiren.com ~]$ grep 111 -r /tmp/demo
/tmp/demo/111:111
/tmp/demo/1:111
[jck287213@shell.ceshiren.com ~]$ grep -l 111 -rr /tmp/demo(展示匹配111内容的文件名称)
/tmp/demo/111
/tmp/demo/1
[jck287213@shell.ceshiren.com ~]$

范围约束

  • 忽略大小写 grep -i pattern file
  • 不显示匹配的行 grep -v pattern file
  • 使用扩展正则表达式 grep -E pattern file
  • 文件范围和目录范围约束 grep 111 -r /tmp/demo/ --include "11*"

进程检索

  • 进程过滤场景比较特殊,需要注意
  • grep 本身会开启新进程,所以需要单独过滤掉 grep 进程
ps -ef | grep ssh
  503  2507     1   0 29 821  ??         0:00.08 /usr/bin/ssh-agent
  503 50022 11154   0  8:11下午 ttys002    0:00.00 grep ssh

ps -ef | grep ssh  | grep -v grep
  503  2507     1   0 29 821  ??         0:00.08 /usr/bin/ssh-agent

[jck287213@shell.ceshiren.com ~]$ ps -ef |grep ssh
root 10330 1 0 2021 ? 00:00:00 sshd: quanjinlong [priv]
quanjin+ 10332 10330 0 2021 ? 00:00:00 [sshd]
root 11927 21257 0 18:23 ? 00:00:00 sshd: ck286073 [priv]
ck286073 11965 11927 0 18:24 ? 00:00:00 sshd: ck286073@pts/0
root 21257 1 0 Sep26 ? 00:00:02 /usr/sbin/sshd -D
root 27798 21257 0 20:45 ? 00:00:00 sshd: jck287213 [priv]
jck2872+ 27801 27798 0 20:45 ? 00:00:00 sshd: jck287213@pts/8
jck2872+ 31023 27802 0 21:25 pts/8 00:00:00 grep --color=auto ssh
[jck287213@shell.ceshiren.com ~]$ ps -ef |grep ssh| grep -v grep
root 10330 1 0 2021 ? 00:00:00 sshd: quanjinlong [priv]
quanjin+ 10332 10330 0 2021 ? 00:00:00 [sshd]
root 11927 21257 0 18:23 ? 00:00:00 sshd: ck286073 [priv]
ck286073 11965 11927 0 18:24 ? 00:00:00 sshd: ck286073@pts/0
root 21257 1 0 Sep26 ? 00:00:02 /usr/sbin/sshd -D
root 27798 21257 0 20:45 ? 00:00:00 sshd: jck287213 [priv]
jck2872+ 27801 27798 0 20:45 ? 00:00:00 sshd: jck287213@pts/8