第一节:grep命令+正则表达式

三剑客之grep命令

一 grep介绍

grep命令主要用于过滤文本,grep家族如下

grep: 在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行
egrep:扩展的egrep,支持更多的正则表达式元字符
fgrep:固定grep(fixed grep),有时也被称作快速(fast grep),意味着它只处理固定字符串即按字面解释所有的字符,而
不是正常表达式,而grep与egrep是支持正则表达式的,现在很多系统中fgrep已经被grep -F替代,二者的功能完全一样

grep命令格式如下

grep [选项] PATTERN 文件1 文件2 ...

[root@egon ~]# grep 'root' /etc/passwd
[root@egon ~]# fgrep 'bash' /etc/passwd

找到:             grep返回的退出状态为0
没找到:            grep返回的退出状态为1
找不到指定文件:      grep返回的退出状态为2

grep 命令的输入可以来自标准输入或管道,而不仅仅是文件,例如:

ps aux |grep '[n]ginx'
为何不能直接ps aux |grep 'nginx'呢,因为不用[]包含,那因为你这条命令本身包含nginx字符
所以也会被过滤出来,过滤的状态码永远为0

二 选项

-n, --line-number           在过滤出的每一行前面加上它在文件中的相对行号
-o, --only-matching         只显示匹配的内容
-q, --quiet, --silent       静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
--color                     颜色
-i, --ignore-case           忽略大小写
-A, --after-context=NUM     如果匹配成功,则将匹配行及其后n行一起打印出来
-B, --before-context=NUM    如果匹配成功,则将匹配行及其前n行一起打印出来
-C, --context=NUM           如果匹配成功,则将匹配行及其前后n行一起打印出来
-c, --count                 如果匹配成功,则将匹配到的行数打印出来
-v, --invert-match          反向查找,只显示不匹配的行
-w                          匹配单词
-E                          等于egrep,扩展

-l, --files-with-matches    如果匹配成功,则只将文件名打印出来,失败则不打印
                            通常-rl一起用,grep -rl 'root' /etc 
-R, -r, --recursive         递归

示例

# 1、-n
[root@egon ~]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@egon ~]# 

# 2、-o
[root@egon ~]# grep -o 'root' /etc/passwd
root
root
root
root
[root@egon ~]# 

# 3、-q
[root@egon ~]# grep -q 'root' /etc/passwd 
[root@egon ~]# echo $?
0

# 4、--color
[root@egon ~]# alias grep
alias grep='grep --color=auto'
[root@egon ~]# 

# 5、-i
[root@egon ~]# echo "EGON" |grep -i egon 
EGON
[root@egon ~]# 

# 6、-A\-B\-C
[root@egon ~]# grep -A 2 'root' /etc/passwd
[root@egon ~]# grep -B 2 'root' /etc/passwd
[root@egon ~]# grep -C 2 'root' /etc/passwd

# 7、-c
[root@egon ~]# grep -c 'root' /etc/passwd
2
[root@egon ~]# 

# 8、-v
[root@egon ~]# ps aux | grep nginx |grep -v grep
[root@egon ~]# 
[root@egon ~]# ps aux | grep [n]ginx
[root@egon ~]# 

# 9、-w
[root@egon ~]# netstat -an |grep -w 80
tcp6       0      0 :::80                   :::*                    LISTEN    
[root@egon ~]# netstat -an |grep  '\<80\>'
tcp6       0      0 :::80                   :::*                    LISTEN    
[root@egon ~]# netstat -an |grep  '\b80\b'
tcp6       0      0 :::80                   :::*                    LISTEN   

# 10、-rl
[root@egon ~]# grep -rl 'root' /etc  # 将/etc目录下所有包含'root'内容的文件都列出来

三 正则表达式

3.1 正则表达式介绍

正则表达式,又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式由元字符组成,通常被用来检索、替换那些符合某个模式(规则)的文本(许多程序设计语言都支持利用正则表达式进行字符串操作)。

元字符:是一类可以表达出超越其字面本身含义的特殊字符

shell元字符(也称为通配符): 由shell解释器来解析,如rm -rf *.pdf,元字符*Shell将其解析为任意多个字符
正则表达式元字符         : 由各种执行模式匹配操作的程序来解析,比如vi、grep、sed、awk

例如:vim示例:
:1,$ s/tom/EGON/g        # 如anatomy、tomatoes及tomorrow中的“tom”被替换了,而Tom确没被替换
:1,$ s/\<[Tt]om\>/EGON/g

3.2 正则表达式元字符

3.2.1 基本正则元字符集

元字符         功能                                        示例    
^             行首                                        ^love
$             行尾                                         love$
.             除了换行符以外的任意单个字符                     l..e
*             前导字符的零个或多个                            ab*love
.*            所有字符                                      a.*love
[]            字符组内的任一字符                              [lL]ove
[^]           对字符组内的每个字符取反(不匹配字符组内的每个字符)   [^a-z0-9]ove
^[^]          非字符组内的字符开头的行

[a-z]         小写字母
[A-Z]         大写字母
[a-Z]         小写和大写字母
[0-9]         数字

\            用来转义元字符                                      love\.    
\<            词首定位符 单词一般以空格或特殊字符做分隔、连续的字符组成  \<love
\>            词尾定位符                                         love\>
\(..\)        匹配稍后将要使用的字符的标签                    \(love\)able\1er    
                                                         :1,$ s/\(192.168.11\).66/\1.50/g

x\{m\}          字符x重复出现m次                                e\{3\}
x\{m,\}         字符x重复出现m次以上                             e\{3,\}                     
x\{m,n\}        字符x重复出现m到n次                             e\{3,6\}    

示例

# 1、^ 行首
[root@egon ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@egon ~]# 

# 2、$ 行尾
[root@egon ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
user1:x:1002:1003::/home/user1:/bin/bash
egon1:x:198:1005::/home/egon1:/bin/bash
gg:x:1004:1006::/home/gg:/bin/bash
egon:x:1005:1007::/home/egon:/bin/bash
tom:x:1006:1008::/home/tom:/bin/bash
[root@egon ~]# 

# 3、. 除了换行符以外的任意单个字符
[root@egon ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@egon ~]# 

# 4、* 前导字符的零个或多个
[root@egon ~]# cat a.txt 
a

ab
abb
abbb
bbbbb
[root@egon ~]# grep 'ab*' a.txt 
a
ab
abb
abbb
[root@egon ~]# 

# 5、.* 所有字符=贪婪
[root@egon ~]# cat a.txt 
a123+-*/c11113333c
a1c
a77Ac
a23333c
ac
111
222
333
[root@egon ~]# grep 'a.*c' a.txt 
a123+-*/c11113333c
a1c
a77Ac
a23333c
ac
[root@egon ~]# 

# 5.1 .*?=》非贪婪,默认情况下,grep不支持非贪婪修饰符,但您可以使用grep -P来使用Perl语法来支持.*?
[root@egon ~]# cat a.txt 
<a href="http://www.baidu.com">"我他妈的是百度"</a>
<a href="http://www.sina.com.cn">"我特么的是新浪"</a>
[root@egon ~]# 

[root@egon ~]# grep -o 'href=".*"' a.txt  # 贪婪
href="http://www.baidu.com">"我他妈的是百度"
href="http://www.sina.com.cn">"我特么的是新浪"
[root@egon ~]# 

[root@egon ~]# grep -oP 'href=".*?"' a.txt  # 非贪婪
href="http://www.baidu.com"
href="http://www.sina.com.cn"
[root@egon ~]# 

# 6、[] 字符组内的任一字符
# 7、[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
[root@egon ~]# cat a.txt 
a1c
a2c
a33c
aAc
aZc
[root@egon ~]# grep 'a[0-9]c' a.txt
a1c
a2c
[root@egon ~]# grep 'a[^0-9]c' a.txt
aAc
aZc
[root@egon ~]# 
[root@egon ~]# grep 'a[0-9][0-9]c' a.txt
a33c
[root@egon ~]# 

# 8、^[^] 非字符组内的字符开头的行
[root@egon ~]# cat a.txt 
a1c
a2c
a33c
aAc
aZc
[root@egon ~]# grep '^[^0-9]..$' a.txt
a1c
a2c
aAc
aZc
[root@egon ~]# 

# 9、[a-z] 小写字母
# 10、[A-Z] 大写字母
# 11、[a-Z] 小写和大写字母
# 12、[0-9] 数字

# 13、\< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
# 14、\> 单词尾
[root@egon ~]# netstat -an |grep -w 80
tcp6       0      0 :::80                   :::*                    LISTEN    
[root@egon ~]# netstat -an |grep  '\<80\>'
tcp6       0      0 :::80                   :::*                    LISTEN    
[root@egon ~]# netstat -an |grep  '\b80\b'
tcp6       0      0 :::80                   :::*                    LISTEN   

Ps: grep匹配换行符和制表符(下述模版文件拷贝的时候制表符会丢失,你需要在你的文件里手动写一下制表符

[root@centos-7 ~]# cat a.txt 
eg
on1
egon123
111on222on333eg
666666
egon
[root@centos-7 ~]# grep -Pz "eg\non" a.txt  # -P使用Perl正则表达式 -z处理多行
eg-------->高亮
on1------->高亮
eg  on123
111on222on333eg
666666
egon
[root@centos-7 ~]# grep -Pzo "eg\non" a.txt  # -P使用Perl正则表达式 -z处理多行
eg
on
[root@centos-7 ~]# 
[root@centos-7 ~]# grep -Pz "eg\ton" a.txt  # -P使用Perl正则表达式 -z处理多行
eg
on1
eg  on123----->高亮,注意,你拷贝这个文档的时候可能无法带上tab键,拷贝到目标文件时自己手动编辑一下加上tab
111on222on333eg
666666
egon
[root@centos-7 ~]# grep -Pzo "eg\ton" a.txt  # -P使用Perl正则表达式 -z处理多行
eg  on----->高亮
[root@centos-7 ~]# 

3.2.2 扩展正则元字符集

联系管理员微信tutu19192010,注册账号

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 青浦区尚茂路798弄 联系方式-13697081366