27_grep

发布时间 2023-10-21 00:56:46作者: 鸟叔书
1.grep 用法举例

-m	匹配几次后停止
-v	反选
-i	忽略字符大小写
-n	显示匹配行号
-c	统计匹配行数
-o	仅显示匹配到的字符串
-q	静默模式
-A	后几行
-B	前几行
-C	前后各几行
-e	多个选项之间“或者”关系
-w	匹配整个单词
-E	启用扩展正则表达式 =egrep
-F	不支持正则表达式 =fgrep
-f	处理两个文件的相同内容,以第一个文件作为匹配条件
-r	递归,但不处理软链接
-R	递归,处理软链接

\           转义
^           表示匹配字符串开始的位置,匹配行首,例: ^a、 ^#
$	        表示匹配字符串末尾的位置,匹配行尾,例: word$、 #$ ;^$表示空行
.           匹配任意的单个字符,例: go.d、g..d 一定存在
*	        匹配前面子表达式0次或者多次,贪婪模式所以尽可能长,例: goo*d、go.*d
.*	        表示任意长度的任一字符,不包括0次
\?	        匹配其前面字符0或1次,可有可无,用来判断重复
\+	        匹配其前面字符最少1次,有且大于等于1次,用来判断重复多个
\{n\}       匹配前面的子表达式n次,例:mo\{2\}y、'[0-9]\{ 2 \}'匹配两位及两位以上数字
\{n,\}      匹配前面的子表达式不少于n次,例: mo\{2,\}y、'[0-9]\{2,\}'匹配两位及两位以上数字
\{,n\}      匹配前面的子表达式不多于n次
\{n,m\}     匹配前面的子表达式n到m次(m>=n),例: mo\{2,3\}y、'[0-9]\{2,3\}'匹配两位到三位数字
\w	        匹配包括下划线的任何单词字符 = [A-Za-z_]
\W	        匹配任何非单词字符。等价于"[^A-Za-z0-9_]" = 特殊字符
\d	        匹配一个数字字符
\D	        匹配一个非数字字符。等价于[^0-9]
\s	        空白符
[:alpha:]	字母,即A-Z,a-z
[:alnum:]	字母和数字
[:lower:]	小写字母,即a-z
[:upper:]	大写字母,即A-Z
[:blank:]	空白字符(空格和制表符)
[:space:]	包括空格、制表符、换行符、回车符等各类型空白
[:print:]	可打印字符
[:punct:]	标点符号

# 针对重复来说的   a\+ => aa
+	        表示匹配前面的子表达式1次及以上
?	        表示匹配前面的子表达式0或者1次
( )         将括号里的内容看成一个整体
|	        以或的方式匹配字符串


# 实战练习
[root@kvm ckh]# cat 1.txt
aabbccdd
eefffaa
jjkk
mmnn
ttssjjJJ
AAaB
[root@kvm ckh]#
[root@kvm ckh]# cat 1.txt | grep "A"
AAaB
[root@kvm ckh]#
[root@kvm ckh]# grep "A" 1.txt
AAaB
[root@kvm ckh]#
[root@kvm ckh]# grep -i "A" 1.txt # 不区分大小写
aabbccdd
eefffaa
AAaB
[root@kvm ckh]# grep -i "ab" 1.txt
aabbccdd
AAaB
[root@kvm ckh]# grep "aB" 1.txt
AAaB
[root@kvm ckh]#
[root@kvm ckh]# grep -n "aB" 1.txt # 添加行号
6:AAaB
[root@kvm ckh]# grep -ni "aB" 1.txt
1:aabbccdd
6:AAaB
[root@kvm ckh]# grep -v "jj" 1.txt # 取反,不显示
aabbccdd
eefffaa
mmnn
AAaB

# 搜到包含kk的行, 同时输出紧跟的上1行,下2行
root@kvm ckh]# cat 1.txt
aabbccdd
eefffaa
jjkk
mmnn
ttssjjJJ
AAaB
[root@kvm ckh]# grep -A2 -B1 "kk" 1.txt  # after 后面, before 前面
eefffaa
jjkk
mmnn
ttssjjJJ

# 继续,添加注释和空格到1.txt
[root@kvm ckh]# cat 1.txt
#
aabbccdd
eefffaa
# 123344
jjkk


mmnn
ttssjjJJ

AAaB

[root@kvm ckh]# grep "^a" 1.txt # 以a开头
aabbccdd
[root@kvm ckh]#
[root@kvm ckh]# grep -i "^a" 1.txt # 以a开头,不区分大小写
aabbccdd
AAaB
[root@kvm ckh]# grep "^#" 1.txt    # 以 # 开头,那就是注释
#
# 123344
[root@kvm ckh]# grep "^$" 1.txt    # 以空格开头,以空格结尾,表示空行
[root@kvm ckh]# grep -E -v "^#|^$" 1.txt # 不看注释和空格
aabbccdd
eefffaa
jjkk
mmnn
ttssjjJJ
AAaB
[root@kvm ckh]# grep -E -v "^#|^$" /etc/chrony.conf     # 实际环境中的配置文件
server ntp.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp10.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp11.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp12.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp2.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp2.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp3.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp3.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp4.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp4.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp5.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp5.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp6.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp6.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp7.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp8.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp9.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
stratumweight 0.05
driftfile /var/lib/chrony/drift
rtcsync
makestep 10 3
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
noclientlog
logchange 0.5
logdir /var/log/chrony

# 文件中,一共有几行包含搜索的字符串
[root@kvm ckh]# cat 1.txt
#
aabbccdd
eefffaa
# 123344
jjkk


mmnn
ttssjjJJ

AAaB
[root@kvm ckh]# grep -c "aa" 1.txt
2
[root@kvm ckh]# grep -c "jj" 1.txt
2
[root@kvm ckh]#
[root@kvm ckh]# grep -c "a" 1.txt
3
[root@kvm ckh]# grep "^[a-e]" 1.txt
aabbccdd
eefffaa

# 指定长度搜索 grep "^.{4}$"  => * 表示任意个字符, . 表示一个字符 .{10} 表示10个任意字符, .* 不是表示任意多
# 反斜杠 \{ \} 只是为了给大括号转义,没有实际意义
[root@kvm ckh]# grep "^.\{4\}$" 1.txt
jjkk
mmnn
AAaB
[root@kvm ckh]# grep "^.\{8\}$" 1.txt
aabbccdd
# 123344
ttssjjJJ

# 以m开头,n结尾,中间有任意2个字符
[root@kvm ckh]# grep "^m.\{2\}n$" 1.txt
mmnn

# 同时搜索多个文件
[root@kvm ckh]# grep "9" 1.txt 2.txt
2.txt:999
[root@kvm ckh]#
[root@kvm ckh]# grep -H "9" 1.txt 2.txt
2.txt:999

# 指定目录搜索
[root@kvm ~]# grep -r "a" ckh/
ckh/1.txt:aabbccdd
ckh/1.txt:eefffaa
ckh/1.txt:AAaB
ckh/2.txt:a
[root@kvm ~]# grep -r "sshd" /etc/ssh/
/etc/ssh/sshd_config.d/50-redhat.conf:# Please, see manual pages for update-crypto-policies(8) and sshd_config(5).
/etc/ssh/sshd_config.d/50-redhat.conf:# It is recommended to use pam_motd in /etc/pam.d/sshd instead of PrintMotd,

# [] 里面,表示或者,或者有c,或者有k
[root@kvm ckh]# grep "[cckk]" 1.txt
aabbccdd
jjkk
[root@kvm ckh]#
[root@kvm ckh]# grep "[ck]" 1.txt
aabbccdd
jjkk
[root@kvm ckh]# grep "[1-9]" 1.txt
# 123344

# 较复杂的搜索
[root@kvm ckh]# cat  1.txt
aabbccdd
eefffaa
jjkk
21zzkk
24mmkk
369mmkk
478zzkk
mmnn
ttssjjJJ
i
AAaB
[root@kvm ckh]# grep "^[0-9]\{2\}" 1.txt
21zzkk
24mmkk
369mmkk
478zzkk
[root@kvm ckh]#
[root@kvm ckh]# grep "^[0-9]\{3\}" 1.txt
369mmkk
478zzkk
[root@kvm ckh]# grep "^[0-9]\{3\}[m]" 1.txt
369mmkk
[root@kvm ckh]#
[root@kvm ckh]# grep "^[0-9]\{2,3\}[m]" 1.txt
24mmkk
369mmkk