轉(zhuǎn):https://blog.csdn.net/hello_hwc/article/details/40017833
Grep
全稱Global Regular Expression Print,表示全局正則表達(dá)式
是一個(gè)強(qiáng)大的文本搜索工具,采用正則匹配
1剿牺、命令格式
grep [options] files
2、主要參數(shù)
-c: 只輸出匹配行的數(shù)目
-i: 不區(qū)分大小寫
-n:顯示匹配航以及行號(hào)
-l:查詢多文件的時(shí)候只輸出包含匹配字符的文件名
-v:反向匹配蚕愤,即顯示不匹配的行
-h: 查詢的時(shí)候不適用文件名
-s:不顯示錯(cuò)誤信息
3凡橱、部分正則表達(dá)式
\ 反義字符:如""""表示匹配""
^$ 開始和結(jié)束
[] 單個(gè)字符慰枕,[A]
[ - ] 匹配一個(gè)范圍呛踊,[0-9a-zA-Z]匹配所有數(shù)字和字母
- 前面的字符出現(xiàn)0次或者多次
- 前面的字符出現(xiàn)了一次或者多次
. 任意字符
4砾淌、經(jīng)典場景
除非要精確區(qū)分大小寫,否則請加上-i來忽略大小寫
(1)結(jié)合find命令和管道
你的一個(gè)音樂文件夾里有多種格式的文件谭网,而你只想找到藝術(shù)家jay的mp3文件汪厨,并且不含有任何的混合音軌
[root@localhost ~]#find . -name ".mp3" | grep -i jay | grep -vi "remix"
分析:
1)使用find -name 來列出所有mp3文件,重定向給grep
- 使用grep -i 來查找包含jay的行
3)使用grep -vi 來查找不包含remix的行
(2)-A -B -C
很多時(shí)候愉择,我們并關(guān)心匹配行而是關(guān)心匹配行的上下文劫乱。這時(shí)候-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來統(tǒng)計(jì)數(shù)目
你手頭有一個(gè)很大的文件,這個(gè)文件包含網(wǎng)址殖妇,比如www.baidu.com tieba.baidu.com等等刁笙。你想要知道有多少個(gè)隸屬于百度的網(wǎng)址
[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 遞歸查找子目錄
查找當(dāng)前目錄極其子目錄下面包含匹配字符的文件
查找子目錄,匹配后輸出行號(hào)拉一,這里的點(diǎn)表示當(dāng)前目錄
[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 HELLO_HWC_CSND_BLOG* .
例子:
[root@localhost ~]# grep -lr baidu .
./file.txt
./test/test.txt
(5)--line-buffered 打開buffering 模式
你有一個(gè)文件是動(dòng)態(tài)的旧乞,它不斷地添加信息到文件的尾部蔚润,而你想要輸出包含某些信息的行。即持續(xù)的grep一個(gè)動(dòng)態(tài)的流
[root@localhost ~]#tail -f file | grep --line-buffered your_pattern
(6)結(jié)合ps查找進(jìn)程
[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
這里我們看到了grep init我們執(zhí)行的命令也被列出來了
如果不想要這一行尺栖,我們可以這么改命令
[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
(7)查找不包含某一個(gè)目錄
[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
這時(shí)候如果我們不想包含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
如果報(bào)錯(cuò)
grep: unrecognized option `--exclude-dir=test'
說明版本過老嫡纠,更新下就ok
(8)查找IP地址
這里用到了-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,只顯示匹配行中匹配正則表達(dá)式的那部分
-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
(9)查找郵箱
[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
njuhwc@gmil.com