我們可以使用grep命令在文本中查找指定的字符串,可以把grep理解成字符查找工具兰吟。
[root@centos7 tmp]# grep "zabbix" /etc/passwd
zabbix:x:988:982:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
默認情況下,grep是區(qū)分大小寫的,使用 -i 選項搜索時忽略大小寫渗鬼。
[root@centos7 tmp]# grep -i "zabbix" /etc/passwd
zabbix:x:988:982:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
ZAbbix:x:1058:1058::/home/ZAbbix:/bin/bash
如果我們想確定zabbix用戶在passwd文件的第一行弹沽,使用-n選項弄痹,顯示文本所在行號翼馆。
[root@centos7 tmp]# grep -i -n "zabbix" /etc/passwd
46:zabbix:x:988:982:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
50:ZAbbix:x:1058:1058::/home/ZAbbix:/bin/bash
如果想知道文件中有多少行包含了指定字符串奈搜,使用-c選項可只統(tǒng)計符號條件的行义钉,而不打印出來。
[root@centos7 tmp]# grep -i -c 'zabbix' /etc/passwd
2
如果我們只想看到被匹配的關鍵字氓英,而不是把關鍵字所在的整行都打印出來侯勉,使用-o選項,但是需要注意,-o選項會把每個匹配到的關鍵字都單獨顯示在一行中進行輸出债蓝。
[root@centos7 tmp]# grep -i -o -n 'zabbix' /etc/passwd
46:zabbix
46:Zabbix
46:zabbix
50:ZAbbix
50:ZAbbix
顯示關鍵字附件的信息 -A after -B before -C content
[root@centos7 tmp]# grep -B2 'zhangsan' /etc/passwd
zabbix:x:988:982:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
grafana:x:987:981:grafana user:/usr/share/grafana:/sbin/nologin
zhangsan:x:800:1059:AdminUser:/tmp/zhangsan:/bin/sh
[root@centos7 tmp]# grep -A2 'zhangsan' /etc/passwd
zhangsan:x:800:1059:AdminUser:/tmp/zhangsan:/bin/sh
oldboy:x:1057:1057::/home/oldboy:/bin/bash
ZAbbix:x:1058:1058::/home/ZAbbix:/bin/bash
[root@centos7 tmp]# grep -C1 'zhangsan' /etc/passwd
grafana:x:987:981:grafana user:/usr/share/grafana:/sbin/nologin
zhangsan:x:800:1059:AdminUser:/tmp/zhangsan:/bin/sh
oldboy:x:1057:1057::/home/oldboy:/bin/bash
如果我們需求精確匹配壳鹤,就是搜索的關鍵字作為一個獨立的單詞存在,而不是包含在某個字符串中饰迹,使用-w選項芳誓,這時候nologin就沒有被匹配到。
[root@centos7 tmp]# grep -w 'login' /etc/passwd
zhangsan:x:1058:1058::/home/zhangsan:/bin/login
如果想取反啊鸭,就是查找不包含指定字符串的行锹淌,使用-v選項。
[root@centos7 tmp]# grep -v -i -n 'nologin' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
48:oldboy:x:1057:1057::/home/oldboy:/bin/bash
49:zhangsan:x:1058:1058::/home/zhangsan:/bin/login
如果想同時匹配多個目標赠制,使用-e選項赂摆,他們之間是“或”的關系。
[root@centos7 tmp]# grep -e 'zhang' -e 'zabbix' /etc/passwd
zabbix:x:988:982:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
zhangsan:x:1058:1058::/home/zhangsan:/bin/login
如果只是想利用grep判斷文本中是否包含某個字符串钟些,你只關心有沒有匹配到烟号,而不想輸出,可以使用-q選項政恍,開啟靜默模式汪拥。
[root@centos7 tmp]# grep -q 'zhang' /etc/passwd
[root@centos7 tmp]# echo $?
0
[root@centos7 tmp]# grep -q -w 'zhang' /etc/passwd
[root@centos7 tmp]# echo $?
1
掌握以上用法,基礎的就夠了篙耗,等學習了“正則表達式”迫筑,再回來結合一起發(fā)揮威力。
grep用法總結:
-i:在搜索的時候忽略大小寫
-n:顯示結果所在行號
-c:統(tǒng)計匹配到的行數宗弯,注意脯燃,是匹配到的總行數,不是匹配到的次數
-o:只顯示符合條件的字符串蒙保,但是不整行顯示辕棚,每個符合條件的字符串單獨顯示一行
-v:輸出不帶關鍵字的行(反向查詢,反向匹配)
-w:匹配整個單詞邓厕,如果是字符串中包含這個單詞逝嚎,則不作匹配
-Ax:在輸出的時候包含結果所在行之后的指定行數,這里指之后的x行邑狸,A:after
-Bx:在輸出的時候包含結果所在行之前的指定行數懈糯,這里指之前的x行,B:before
-Cx:在輸出的時候包含結果所在行之前和之后的指定行數单雾,這里指之前和之后的x行赚哗,C:context
-e:實現多個選項的匹配,邏輯or關系
-q:靜默模式硅堆,不輸出任何信息屿储,當我們只關心有沒有匹配到,卻不關心匹配到什么內容時渐逃,我們可以使用此命令够掠,然后,使用”echo $?”查看是否匹配到茄菊,0表示匹配到疯潭,1表示沒有匹配到赊堪。
-P:表示使用兼容perl的正則引擎。
-E:使用擴展正則表達式竖哩,而不是基本正則表達式哭廉,在使用”-E”選項時,相當于使用egrep相叁。
grep結合正則表達式
字符類 [ ] 括號內的僅匹配其中一個字符
如果我想要搜尋 test 或 taste 這兩個單字時遵绰,可以發(fā)現到,其實她們有共通的 't?st'
[root@centos7 tmp]# grep -n 't[ae]st' test
2:i can't finish the test
3:oh! the soup taste good!!!
字符類的反向選擇 [^]
連續(xù)字符 [a-zA-Z0-9]
[root@centos7 tmp]# cat test
abc#123#def#456
i can't finish the test
oh! the soup taste good!!!
football game is not use feet only
gooooood bye!
google is the best tools for search keyword
如果想要搜索到有 oo 的行增淹,但不想要 oo 前面有 g
[root@centos7 tmp]# grep -n '[^g]oo' test
4:football game is not use feet only
5:gooooood bye!
6:google is the best tools for search keyword
我們發(fā)現把google也搜索出來了椿访,這好像和我們的預期不符合,為什么呢虑润?因為后面有符號的tools,所以這一行也是符號的成玫。
如果不想oo之前出現小寫字母
[root@centos7 tmp]# grep -n '[^a-z]oo' test
4:Football game is not use feet only
匹配行首 ^
結合[]時要注意^的位置
匹配行尾 $
[root@centos7 tmp]# grep -n '^i' test
2:i can't finish the test
[root@centos7 tmp]# grep -n '^[A-Z]' test
4:Football game is not use feet only
匹配不是以字母開頭的行,注意^的位置,在 [] 內代表『反向選擇』端辱,在 [] 之外則代表定位在行首的意義
[root@centos7 tmp]# grep '^[^a-zA-Z]' test
222abc#123#def#456
555 gooooood bye!
[root@centos7 tmp]# grep -n 'd$' test
3:oh! the soup taste good
6:google is the best tools for search keyword
如果想找出以 . 結尾的行梁剔,因為 . 具有其他含義,必須轉義\.
[root@centos7 tmp]# grep '\.$' test
oh! the soup taste good.
google is the best tools for search keyword.
找出空白行使用 grep '^$'
我們來看 . 和 * 在正則中的含義
. 表示任意一個字符
星號*表示重復他前面的字符0次到無窮多次
[root@centos7 tmp]# grep 'g..d' test
oh! the soup taste good.
好好折磨下面這個示例舞蔽,*號前面的o可以出現0次荣病,也可以出現多次
[root@centos7 tmp]# grep 'ooo*' test
oh! the soup taste good.
Football game is not use feet only
555 gooooood bye!
google is the best tools for search keyword.
[root@centos7 tmp]# grep 'goo*d' test
oh! the soup taste good.
555 gooooood bye!
[root@centos7 tmp]# grep 'g.*d' test
oh! the soup taste good.
555 gooooood bye!
google is the best tools for search keyword.
慢慢品味區(qū)別
[root@centos7 tmp]# grep '[0-9]*' test
222abc#123#def#456
i can't finish the test
oh! the soup taste good.
Football game is not use feet only
555 gooooood bye!
google is the best tools for search keyword.
[root@centos7 tmp]# grep '[0-9][0-9]*' test
222abc#123#def#456
555 gooooood bye!
限定范圍的字符{} ,但因為 { 與 } 的符號在 shell 是有特殊意義的,因此渗柿, 我們必須要使用字符 \ 來讓他失去特殊意義才行个盆。
假設我要找到兩個 o 的字串
[root@centos7 tmp]# grep 'o\{2\}' test
oh! the soup taste good.
Football game is not use feet only
555 gooooood bye!
google is the best tools for search keyword.
假設我們要找出 g 后面接 2 到 5 個 o ,然后再接一個 d的字符串
[root@centos7 tmp]# grep 'go\{2,5\}d' test
oh! the soup taste good.
goooood bye!
goodle is the best tools for search keyword.
[root@centos7 tmp]# grep 'go\{2,\}d' test
使用擴展grep -E
[root@centos7 tmp]# free -h | egrep 'Mem|Swap'
Mem: 7.8G 3.5G 1.4G 231M 2.9G 3.7G
Swap: 6.0G 264K 6.0G
如果使用grep將沒有東西輸出朵栖,如果在擴展元字符前面加\颊亮,grep會自動啟用擴展選項-E。
[root@centos7 tmp]# free -h | grep 'Mem|Swap'
[root@centos7 tmp]# free -h | grep 'Mem\|Swap'
Mem: 7.8G 3.5G 1.4G 231M 2.9G 3.7G
Swap: 6.0G 264K 6.0G
搜索包含一個或多個字母o的行
[root@centos7 tmp]# egrep 'o+' test
oh! the soup taste good.
Football game is not use feet only
goooood bye!
goodle is the best tools for search keyword.
[root@centos7 tmp]# grep -E 'o+' test
oh! the soup taste good.
Football game is not use feet only
goooood bye!
goodle is the best tools for search keyword.
[root@centos7 tmp]# grep 'o\+' test
oh! the soup taste good.
Football game is not use feet only
goooood bye!
goodle is the best tools for search keyword.
搜索所有包含0個或1個數字的行陨溅。
[root@centos7 tmp]# egrep '2\.?[0-9]' test
222abc#123#def#456
[root@centos7 tmp]# grep -E '(go)+' test
oh! the soup taste good.
goooood bye!
goodle is the best tools for search keyword.
fgrep 查詢速度比grep命令快终惑,但是不夠靈活:它只能找固定的文本,而不是規(guī)則表達式门扇。
在文本中找出包含#的行
[root@centos7 tmp]# grep -F '#' test
222abc#123#def#456