Linux系統中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是全部用戶。node
grep [options]
正則表達式
[options]主要參數: -c:只輸出匹配行的計數。 -I:不區分大 小寫(只適用於單字符)。 -h:查詢多文件時不顯示文件名。 -l:查詢多文件時只輸出包含匹配字符的文件名。 -n:顯示匹配行及行號。 -s:不顯示不存在或無匹配文本的錯誤信息。 -v:顯示不包含匹配文本的全部行。
pattern正則表達式主要參數: \: 忽略正則表達式中特殊字符的原有含義。 ^:匹配正則表達式的開始行。 $: 匹配正則表達式的結束行。 \<:從匹配正則表達 式的行開始。 \>:到匹配正則表達式的行結束。 [ ]:單個字符,如[A]即A符合要求 。 [ - ]:範圍,如[A-Z],即A、B、C一直到Z都符合要求 。 。:全部的單個字符。 * :有字符,長度能夠爲0。
$ grep 'test' d* 顯示全部以d開頭的文件中包含 test的行。 $ grep 'test' aa bb cc 顯示在aa,bb,cc文件中匹配test的行。 $ grep '[a-z]\{5\}' aa 顯示全部包含每一個字符串至少有5個連續小寫字符的字符串的行。 $ grep 'wesest.*\1' aa 若是west被匹配,則es就被存儲到內存中,並標記爲1,而後搜索任意個字符(.*),這些字符後面緊跟着 另一個es(\1),找到就顯示該行。若是用egrep或grep -E,就不用」\」號進行轉義,直接寫成’w(es)t.*\1′就能夠了。
除非要精確區分大小寫,不然請加上-i來忽略大小寫express
想要實現
你的一個音樂文件夾裏有多種格式的文件,而你只想找到藝術家jay的mp3文件,而且不含有任何的混合音軌工具
命令[root@localhost ~]#find . -name ".mp3" | grep -i jay | grep -vi "remix"
oop
分析
1)使用find -name 來列出全部mp3文件,重定向給grep
2) 使用grep -i 來查找包含jay的行
3)使用grep -vi 來查找不包含remix的行google
不少時候,咱們並關心匹配行而是關心匹配行的上下文。這時候-A -B -C就有用了
-A n 後n行,A記憶爲(After)
-B n 前n行,B記憶爲(Before)
-C n 前n行,後n行,C記憶爲(Center)code
舉例regexp
[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
你手頭有一個很大的文件,這個文件包含網址,好比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
命令(查找當前路徑下全部文件中,含有baidu
的文件)[root@localhost ~]# grep -nr HELLO_HWC_CSND_BLOG* .
例子
#查找當前路徑下全部文件中,含有`baidu`的文件 [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 HELLO_HWC_CSND_BLOG* .
例子
#查找子目錄,匹配後只輸出文件名 [root@localhost ~]# grep -lr baidu . ./file.txt ./test/test.txt
命令[root@localhost ~]#grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
例子
[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 這時候若是咱們不想包含test目錄 [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
若是報錯
grep: unrecognized option `--exclude-dir=test'
說明版本過老,更新下就ok
命令說明
這裏用到了-o和-P命令
咱們經過man grep查看
-o, --only-matching:
Show only the part of a matching line that matches PATTERN.
-P, --perl-regexp:
Interpret PATTERN as a Perl regular expression.
也就是說-o,只顯示匹配行中匹配正則表達式的那部分
-P,做爲Perl正則匹配
舉例
[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
命令說明[root@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