基于正则表达式查找满足条件的行
内容检索
规则表达式
^ # 锚定行的开始 如:'^grep’匹配所有以grep开头的行。
$ # 锚定行的结束 如:‘grep$’ 匹配所有以grep结尾的行。
. # 匹配一个非换行符的字符 如:'gr.p’匹配gr后接一个任意字符,然后是p。
.* # 一起用代表任意字符。
# 匹配一个指定范围内的字符,如’[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