详解grep(一)grep基础、语法格式、常用选项与退出状态码的案例解析

目录

一、GREP基础

1.1 grep的全称

1.2 grep语法格式

二、grep常用选项

2.1 长短选项的说明

2.2 显示常用信息

2.3 控制匹配模式的选项

2.4 控制输出内容的选项

2.5 控制输出行前缀的选项

2.6 控制输出行上下文的选项

2.7 文件和目录的选择选项

三、退出状态码

四、不同的搜索引擎(不同的grep程序)

五、sed、awk、grep三剑客默认所使用的正则表达式类型


一、GREP基础

1.1 grep的全称

global search expression and print,全局搜索正则表达式并打印输出

用于查找内容包含指定范本样式的文件。grep指令会把含有范本样式的那一行显示出来。而这个范本样式也就是我们在sed中所说的模式,模式可以是正则表达式也可以是普通的模式

 

1.2 grep语法格式

grep OPTIONS PATTERN INPUT_FILE_NAMES

  • OPTIONS:指定0至多个

  • PATTERN:即为模式,前面没有-e PATTERN或-f FILE时指定的PATTERN才会被grep识别。否则紧跟在-e选项或者-f选项后面的才会被grep程序识别成PATTERN,而除此之外的PATTERN将被错错误识别成文件名。
  • INPUT_FILE_NAMES:可以指定0至多个INPUT_FILE_NAMES
#示例:过滤IP地址
[tyson@localhost ~]$ ifconfig |grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
        inet 192.168.43.49  netmask 255.255.255.0  broadcast 192.168.43.255
        inet6 fe80::4e92:349a:6f19:ff18  prefixlen 64  scopeid 0x20<link>
        inet 127.0.0.1  netmask 255.0.0.0

 

二、grep常用选项

2.1 长短选项的说明

OSIX.2:便于POSIX可移植性变成。

GNU扩展的:长选项

 

2.2 显示常用信息

--hlep 显示常用选项

-V 显示版本

--version

 

2.3 控制匹配模式的选项

-e PATTERN

明确指定使用此处的PATTERN作为待匹配的PATTERN,可以指定多个

 

-f FILE

从文件中获取模式列表

[tyson@localhost ~]$ ifconfig|grep -f findIp.txt 
        inet 192.168.43.49  netmask 255.255.255.0  broadcast 192.168.43.255
        inet6 fe80::4e92:349a:6f19:ff18  prefixlen 64  scopeid 0x20<link>
        inet 127.0.0.1  netmask 255.0.0.0
[tyson@localhost ~]$ cat findIp.txt 
[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}

需要注意的是,若-f所指定的文件是空文件,则表示任何行都无法匹配,与awk不指定PATTERN时的情况不一样。

 

-i

-y

--ignore-case

忽略PATTERN的大小写(包括命令行和文件两种形式所指定的PATTERN)

[tyson@localhost ~]$ cat quote2.txt 
line1
line2
line3
line4
line5
line6
line7
line8
line9
line10
line11
line12
line13
line14
[tyson@localhost ~]$ grep -i 'LINE5' quote2.txt 
line5
[tyson@localhost ~]$ grep 'LINE5' quote2.txt 

 

-v

--invert-match

翻转匹配结果,输出未匹配中的行

#输出不是ip地址的行
[tyson@localhost ~]$ ifconfig|grep -v -f findIp.txt 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:d2:ca:67  txqueuelen 1000  (Ethernet)
        RX packets 1956  bytes 165407 (161.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1333  bytes 156686 (153.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 68  bytes 5912 (5.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 68  bytes 5912 (5.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

-w

--word-regexp

仅选择能够精确整个单词的行:也就是单词的每一个字母必须精确匹配,不可多或少

  • 何为边界:除了单词所能包含的字符外,其他字符都是分隔符,例如:空格、换行符、括号、中括号、数学运算符等。
  • 何为单词:这里的单词仅由数字、字母、下划线组成。例如_word_:_不属于单词部分而是分隔符,word则是分隔符
#精确匹配单词
[tyson@localhost ~]$ echo -e 'abc\nabcc' |grep -w 'abc'
abc

 

-x

--line-regexp

仅选择能精确匹配整行内容的行。相当于在PTTERN中的匹配规则都变成这样了:^REGEXP$。

在下例中,第一行整行内容不是abc,所以无法匹配。而第二行的整行内容是abc,所以可以匹配。

[tyson@Tyson Lee learnGrep]$ echo -e "abcd\nabc"|grep -x "abc" 
abc
[tyson@Tyson Lee learnGrep]$ echo -e "abcd\nabc"|grep "abc"   
abcd
abc
[tyson@Tyson Lee learnGrep]$ echo -e "abcd\nabc"|grep "^abc$"
abc

 

2.4 控制输出内容的选项

-c

不再输出匹配的内容,输出匹配到的行的数量。

[tyson@Tyson Lee learnGrep]$ ifconfig |grep -f findIp.grep 
        inet 192.168.43.49  netmask 255.255.255.0  broadcast 192.168.43.255
        inet6 fe80::4e92:349a:6f19:ff18  prefixlen 64  scopeid 0x20<link>
        inet 192.168.43.179  netmask 255.255.255.0  broadcast 192.168.43.255
        inet 127.0.0.1  netmask 255.0.0.0
[tyson@Tyson Lee learnGrep]$ ifconfig |grep -c -f findIp.grep 
4

 

与-v选项结合还能输出没能成功匹配的行的数量。

[tyson@Tyson Lee learnGrep]$ ifconfig |grep -v -c -f findIp.grep  
23
[tyson@Tyson Lee learnGrep]$ ifconfig |grep -v -f findIp.grep    
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:d2:ca:67  txqueuelen 1000  (Ethernet)
        RX packets 3928  bytes 314820 (307.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2001  bytes 247643 (241.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::3eae:dcdd:5ed8:5736  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d2:ca:71  txqueuelen 1000  (Ethernet)
        RX packets 1135  bytes 76281 (74.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20  bytes 3882 (3.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

-L

不再输出匹配的内容,而是输出未能被匹配到的文件名。

在大批文件中搜索不包含某个字符串的文件。

[tyson@Tyson Lee learnGrep]$ grep -L "tyson" a.txt b.txt 
b.txt
[tyson@Tyson Lee learnGrep]$ cat a.txt 
tyson
[tyson@Tyson Lee learnGrep]$ cat b.txt 
nginx

 

-l

与-L恰好相反。不再输出匹配的内容,而是输出能被匹配到的文件名,当某文件中的某行被匹配到,将不再继续向下搜索该文件。

[tyson@Tyson Lee learnGrep]$ grep -L "tyson" a.txt b.txt 
a.txt
[tyson@Tyson Lee learnGrep]$ cat a.txt 
tyson
[tyson@Tyson Lee learnGrep]$ cat b.txt 
nginx

 

-m NUM

判断某个文件里面是否至少有NUM行匹配,并打印前NUM个匹配行。

[tyson@Tyson Lee learnGrep]$ grep -m 2 "line" a.txt b.txt c.txt  
a.txt:line1
a.txt:line2
b.txt:line1
b.txt:line2
c.txt:line1
c.txt:line2
[tyson@Tyson Lee learnGrep]$ cat a.txt 
line1
line2
line3
4
[tyson@Tyson Lee learnGrep]$ cat b.txt 
line1
line2
3
4
5
6
7
[tyson@Tyson Lee learnGrep]$ cat c.txt 
line1
line2
line3
line4
5
6

 

-o

只输出被匹配成功的字符串而不是整行。每个被匹配到的字符串都以单独的行输出。

[tyson@Tyson Lee learnGrep]$ ifconfig |grep -o -f findIp.grep 
192.168.43.49
255.255.255.0
192.168.43.255
4e92:349
192.168.43.179
255.255.255.0
192.168.43.255
127.0.0.1
255.0.0.0

 

-q

-s

--color

不怎么常用,可以参考help中的解释。

-s, --no-messages         suppress error messages
-q, --quiet, --silent     suppress all normal output
      --binary-files=TYPE   assume that binary files are TYPE;
                            TYPE is 'binary', 'text', or 'without-match'
--colour[=WHEN]       use markers to highlight the matching strings;
                            WHEN is 'always', 'never', or 'auto'

 

2.5 控制输出行前缀的选项

默认开启的-b -H

-b 打印从0开始的字节偏移

-H 指定了多个文件时,还需要输出匹配到的行所在的文件名。

 

-h

禁止输出文件名

 

-n

输出匹配内容在文件中的行号,每个文件都单独从1开始计数

[tyson@Tyson Lee learnGrep]$ grep -n "line" a.txt b.txt c.txt      
a.txt:1:line1
a.txt:2:line2
a.txt:3:line3
b.txt:1:line1
b.txt:2:line2
c.txt:1:line1
c.txt:2:line2
c.txt:3:line3
c.txt:4:line4

 

不常用:-T、-Z、-u、--label=LABEL

 --label=LABEL         use LABEL as the standard input file name prefix
 -Z, --null                print 0 byte after FILE name
 -u, --unix-byte-offsets   report offsets as if CRs were not there
                            (MSDOS/Windows)

 

2.6 控制输出行上下文的选项

grep不会多次输出同一行

 

-A NUM 输出匹配到的行与匹配到的后NUM行

--after

grep -A 5 '88' filename

 

-B NUM 输出匹配到的行与匹配到的后NUM行

--before

 

-C NUM 输出上下浮动NUM 行

--context

[tyson@Tyson Lee learnGrep]$ cat /etc/passwd|grep "nobody"
nobody:x:99:99:Nobody:/:/sbin/nologin
[tyson@Tyson Lee learnGrep]$ cat /etc/passwd|grep -A 5 "nobody"
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[tyson@Tyson Lee learnGrep]$ cat /etc/passwd|grep -B 5 "nobody" 
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
[tyson@Tyson Lee learnGrep]$ cat /etc/passwd|grep -C 3 "nobody" 
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin

 

不常用--group-separato 、--no-group-separator

--group-separator=SEP use SEP as a group separator
--no-group-separator  use empty string as a group separator

 

2.7 文件和目录的选择选项

-r

--recursive

-R

--dereference-recursive

对指定的目录进行递归搜索

[tyson@Tyson Lee ~]$ grep -r "tyson" .
./learnShell/testRead.sh:r_username="tyson"
./learnShell/tyson.sh:/home/tyson/learnShell/1.sh
./learnShell/testTest.sh:if [[ $USER == tyson* ]]
./learnShell/testTest.sh:       echo "the user include str:tyson,welcome $USER."
./learnShell/testTest.sh:       echo "the user don't include str:tyson,welcome,other."
Binary file ./learnShell/.testBreak.sh.swp matches
./learnShell/testFun/function_02.sh:    tyson.com
./learnShell/testawk/big:tyson
./learnShell/testawk/big:tyson1
./learnShell/testawk/textChong.txt:tyson
./learnShell/testawk/textChong.txt:tyson1
./learnShell/testawk/textChong1.txt:tyson
./learnShell/testawk/textChong1.txt:tyson1
Binary file ./bzip2.tar matches
Binary file ./bin/bin.tar matches
./.viminfo:     tyson
./.viminfo:     [tyson@localhost ~]$ cat findIp.txt 
./.viminfo:> ~/learnShell/tyson.sh

 

--exclude-dir=DIR

筛选出不进行递归搜索的目录,使用DIR进行匹配

[tyson@Tyson Lee ~]$ grep -r --exclude-dir="learnShell" "tyson" .  
Binary file ./bzip2.tar matches
Binary file ./bin/bin.tar matches
./.viminfo:     tyson
./.viminfo:     [tyson@localhost ~]$ cat findIp.txt 
./.viminfo:> ~/learnShell/tyson.sh

 

不常用

--include=FILE_PATTERN

search only files that match FILE_PATTERN

 

三、退出状态码

通常情况下,如果能匹配到内容,则退出状态码为0,否则为1。但是如果发生了错误,则退出状态码为2。

若使用了-s -q退出状态码不可以作为shell脚本等匹配是否成功的依据

 

-q

--quiet

静默模式,即使遇到了错误也不输出任何内容到标准输出。尽量避免使用该选项,通过将标准错误输出到/dev/null的形式较好。

-s

--no-messages

禁止输出因未见不存在或文件没有度权限而产生的错误输出。尽量避免使用该选项,通过将标准错误输出到/dev/null的形式较好。

 

四、不同的搜索引擎(不同的grep程序)

-G 是默认的grep程序,支持基本正则表达式的引擎去解析PATTERN

-E 使用扩展正则表达式的引擎,在使用上:grep -E与egrep等同。

例如:

基本正则表达式:[0-9]\{1,3\}

扩展正则表达式:[0-9]{1,3}

 

-F 相当于使用fgrep,是不支持任何正则表达式的grep

P 使用perl正则比到时引擎。

 

五、sed、awk、grep三剑客默认所使用的正则表达式类型

sed:基本正则表达式

grep:基本正则表达式

awk:扩展正则表达

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值