Grep
全名為Global Regular Expression Print,表示全域正規表示式
是強大的文字搜尋工具,採用正規比對
1、指令格式
grep [options] files
2、主要參數
-c匹配行的數目
-i: 不區分大小寫
-n:顯示匹配航以及行號
-l:查詢多文件的時候只輸出包含匹配字符的文件名
-v:反向匹配,即顯示不符合的行
-h: 查詢的時候不適用檔案名稱
-s:不顯示錯誤訊息
3、部分正規表示式
反義字元:如""""表示符合""
^$ 開始和結束
[] 單個字符,[A]
[ - ] 匹配一個範圍,[0-9a-zA-Z]匹配所有數字和字母
* 前面的字符出現0次或者多次
+ 前面的字符出現了一次或者多次
. 任意字符
4、經典場景
除非要精確區分大小寫,否則請加上-i來忽略大小寫
(1)結合find命令和管道
你的一個音樂資料夾裡有多種格式的文件,而你只想找到藝術家jay的mp3文件,並且不含有任何的混合音軌
[root@localhost ~]#find . -name ".mp3" | grep -i jay | grep -vi "remix"
分析: 1)使用find -name 列出所有mp3文件,重定向給grep
2) 使用grep -i 來查找包含jay的行
3)使用grep -vi 來查找不包含remix的行
(2)-A -B -C
很多時候,我們並關心匹配行而是關心匹配行的上下文。這時候-A -B -C就有用了
-A n 後n行,A記憶為(After)
-B n 前n行,B記憶為(Before)
-C n 前n行,後n行,C記憶為(Center)
舉例
[root@localhost ~]# ifconfig | grep -A 2 "Link encap" eth0 Link encap:Ethernet HWaddr 00:0C:29:F3:38:15 inet addr:192.168.91.129 Bcast:192.168.91.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fef3:3815/64 Scope:Link -- lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host [root@localhost ~]# ifconfig | grep -C 2 "lo" Interrupt:67 Base address:0x2024 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host
(3) 用-c來統計數目
你手邊有一個很大的文件,這個文件包含網址,例如www.baidu.com tieba.baidu.com等等。你想要知道有多少個隸屬於百度的網址
[
root@localhost ~]# grep -c "*baidu.com*" filename 例子 [root@localhost ~]# cat file.txt wtmp begins Mon Feb 24 14:26:08 2014 192.168.0.1 162.12.0.123 "123" 123""123 njuhwc@163.com njuhwc@gmil.com 123 www.baidu.com tieba.baidu.com www.google.com www.baidu.com/search/index [root@localhost ~]# grep -cn ".*baidu.com.*" file.txt 3
(4) -r 遞歸查找子目錄
查找當前目錄極度子目錄下麵包含匹配字符的文件
查找子目錄,匹配後輸出行號,這裡的點表示目前目錄
[root@localhost ~]# grep -nr HELLO_HWC_CSND_BLOG* .
範例:
[root@localhost ~]# grep -nr baidu . ./file.txt:8:www.baidu.com ./file.txt:9:tieba.baidu.com ./file.txt:11:www.baidu.com/search/index ./test/test.txt:1:http://www.baidu.com
查找子目錄,符合後只輸出檔案名稱
[
[root@localhost ~]# grep -lr baidu . ./file.txt ./test/test.txt
[ groot@locallr HELLO_HWC_CSND_BLOG* .
例子:
[root@localhost ~]# ps aux | grep init root 1 0.0 0.1 2072 632 ? Ss 22:52 0:01 init [5] root 4210 0.0 0.1 6508 620 ? Ss 23:01 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "/usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients" root 4233 0.0 0.0 2780 504 ? S 23:01 0:00 /usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients root 4956 0.0 0.1 3920 680 pts/1 R+ 23:27 0:00 grep init
(6)結合ps ine
[root@localhost ~]# ps aux | grep [i]nit root 1 0.0 0.1 2072 632 ? Ss 22:52 0:01 init [5] root 4210 0.0 0.1 6508 620 ? Ss 23:01 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "/usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients" root 4233 0.0 0.0 2780 504 ? S 23:01 0:00 /usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients
(6)結合ps ine
如果不想要這一行,我們可以這麼改指令
[root@localhost ~]# ls anaconda-ks.cfg Desktop file.txt find.result install.log install.log.syslog test [root@localhost ~]# grep -r baidu . ./file.txt:www.baidu.com ./file.txt:tieba.baidu.com ./file.txt:www.baidu.com/search/index ./test/test.txt:http://www.baidu.com
(7)找出不包含某一個目錄
[root@localhost ~]#grep -R --exclude-dir=node_modules 'some pattern' /path/to/search例子
[root@localhost ~]# grep -R --exclude-dir=text "baidu" . ./file.txt:www.baidu.com ./file.txt:tieba.baidu.com ./file.txt:www.baidu.com/search/index
這時候如果我們不想包含test目錄
grep: unrecognized option `--exclude-dir=test'
[root@localhost ~]# cat file.txt wtmp begins Mon Feb 24 14:26:08 2014 192.168.0.1 162.12.0.123 "123" 123""123 njuhwc@163.com njuhwc@gmil.com 123 www.baidu.com tieba.baidu.com www.google.com www.baidu.com/search/index [root@localhost ~]# grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt 192.168.0.1 162.12.0.123
-P,作為Perl正則符合查找@localhost ~]# grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+" file. txt
範例
[root@localhost ~]# cat file.txt wtmp begins Mon Feb 24 14:26:08 2014 192.168.0.1 162.12.0.123 "123" 123""123 njuhwc@163.com njuhwc@gmil.com 123 www.baidu.com tieba.baidu.com www.google.com www.baidu.com/search/index [root@localhost ~]# grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file.txt njuhwc@163.com njuhwc@gmil.com