grep命令應用實例

轉:https://blog.csdn.net/hello_hwc/article/details/40017833

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

  1. 使用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 HELLO_HWC_CSND_BLOG* .

例子:

[root@localhost ~]# grep -lr baidu .
./file.txt
./test/test.txt

(5)--line-buffered 打開buffering 模式
你有一個文件是動態的,它不斷地添加信息到文件的尾部,而你想要輸出包含某些信息的行。即持續的grep一個動態的流

[root@localhost ~]#tail -f file | grep --line-buffered your_pattern 

(6)結合ps查找進程

[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我們執行的命令也被列出來了
如果不想要這一行,我們可以這么改命令

[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)查找不包含某一個目錄

[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

(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,只顯示匹配行中匹配正則表達式的那部分
-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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.創建文件夾 !/bin/sh mkdir -m 777 "%%1" 2.創建文件 !/bin/sh touch...
    BigJeffWang閱讀 10,192評論 3 53
  • 項目上線之后,或者在測試環境,經常會有bug讓我們去排查和修改,這個時候,我們需要在linux系統中使用一些命令幫...
    時之令閱讀 2,847評論 0 2
  • 正則表達式 關于正則表達式相信很多學計算機的人都聽說過 尤其是做編程行業的人 那什么是正則表達式 正則表達式,又稱...
    數據革命閱讀 919評論 0 1
  • 愛情有時候并不完全如我們想象的那般,在某個世界他可能有不一樣的光彩。 我叫夕瑤,今年24歲,本命年,我總覺得做好多...
    故事小姐閱讀 451評論 0 1
  • 把破舊揉碎,做成幸福之衣 讓荒涼繼續荒蕪,長出春水 天亮前我與一棵荊棘抱頭痛哭 孤獨的人,你為何站在橋上 黃昏搶走...
    關長天閱讀 536評論 25 54