Linux grep命令和正規表示式

pursuer.chen發表於2016-04-05

介紹

grep是一個功能強大的文字搜尋命令,可以用它來搜尋某個檔案中是否包含指定的搜尋內容,它可以利用正規表示式來做複雜的篩選操作,它還可以為其它命令傳輸給管道的篩選,比如我們常用到的分析單個程式的操作就是會利用它“ps -ef|grep command”。

 

語法

grep [OPTION]... PATTERN [FILE]...

預設不加引數是顯示匹配上的行記錄,可以使用--help來檢視它所支援的所以引數,本文只會列舉比較常用的一些命令。

-a:輸出的內容不要忽略二進位制資料
-b<n>:輸出匹配上的n個位元組的行。
-c :只顯示符合條件的行的數量,不顯示內容
-d:當你要查詢的是目錄而不是檔案的時候需要制定該引數,否則會報錯
-H:在輸出的內容行前加上該行所屬的檔名。
-h:不在輸出的行前加上該行所屬的檔名,這是預設的選項。
-i:忽略大小寫
-L:列出不符合查詢內容的檔案的檔名
-l:列出符合查詢內容的檔案的檔名
-m<n>:只輸出匹配上的指定n行。
-o:只顯示查詢的內容,不顯示該行其它的內容。
-q:什麼都不輸出
-r:如果需要遍歷整個目錄的所有檔案,可以使用該引數
-v:顯示沒有匹配上的行資訊,和預設值相反
-V:顯示版本資訊

正規表示式

grep配合正則進行篩選的時候對於{ } ()都需要用到轉義字元。

命令

說明

^

在字元的開啟處進行匹配

$

在字元的末尾處進行匹配

.

匹配任何字元(包括回車和新行)

[….]

匹配括號內的任意單個字元

[m-n]

匹配m到n之間的任意單個字元,例如[0-9],[a-z],[A-Z]

[^..]

不能匹配括號內的任意單個字元

a*

匹配0個或多個a,包括空

a\{m\}

匹配m個a

a\{m,\}

匹配m個或者更多個a

a\{m,n\}

匹配m到n個a

\(….\)

將模式元素組成單一元素,例如(do)*意思是匹配0個多或多個do

 

grep常見用法

建立測試資料

grep --help >/tmp/grep.text

1.為其它命令做篩選操作

查詢包含sbin的程式

[root@localhost ~]# ps -ef |grep "sbin"
root 1 0 0 11:04 ? 00:00:01 /sbin/init
root 543 1 0 11:04 ? 00:00:00 /sbin/udevd -d
root 1559 1 0 11:04 ? 00:00:00 /usr/sbin/vmware-vmblock-fuse -o subtype=vmware-vmblock,default_permissions,allow_other /var/run/vmblock-fuse
root 1580 1 0 11:04 ? 00:00:18 /usr/sbin/vmtoolsd
root 1992 1 0 11:04 ? 00:00:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
root 2078 1 0 11:04 ? 00:00:00 /usr/sbin/modem-manager
root 2122 1 0 11:04 ? 00:00:00 /usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -B -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid
root 2133 1 0 11:05 ? 00:00:00 /usr/sbin/acpid
root 2219 1 0 11:05 ? 00:00:00 /usr/sbin/bluetoothd --udev
root 2298 1 0 11:05 ? 00:00:00 /usr/sbin/sshd
root 3172 1 0 11:05 ? 00:00:00 /usr/sbin/abrtd
root 3199 1 0 11:05 ? 00:00:00 /usr/sbin/atd
root 3215 1 0 11:05 ? 00:00:00 /usr/sbin/gdm-binary -nodaemon
root 3220 1 0 11:05 tty2 00:00:00 /sbin/mingetty /dev/tty2
root 3222 1 0 11:05 tty3 00:00:00 /sbin/mingetty /dev/tty3
root 3224 1 0 11:05 tty4 00:00:00 /sbin/mingetty /dev/tty4
root 3227 543 0 11:05 ? 00:00:00 /sbin/udevd -d
root 3228 1 0 11:05 tty5 00:00:00 /sbin/mingetty /dev/tty5
root 3230 1 0 11:05 tty6 00:00:00 /sbin/mingetty /dev/tty6
root 3231 543 0 11:05 ? 00:00:00 /sbin/udevd -d
root 3261 1 0 11:05 ? 00:00:00 /usr/sbin/console-kit-daemon --no-daemon
root 5923 2071 0 14:12 ? 00:00:00 /sbin/dhclient -d -4 -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-eth0.pid -lf /var/lib/dhclient/dhclient-3a7ff4d9-5a09-46b1-bb20-0298a18e6b78-eth0.lease -cf /var/run/nm-dhclient-eth0.conf eth0
root 6294 6044 0 15:50 pts/1 00:00:00 grep sbin

2. 查詢行數

查詢包含“-d”的行數
[root@localhost ~]# grep -c "\-d" /tmp/grep.txt 
6

3.$

查詢以lines結尾的行

[root@localhost ~]# grep  "lines$" /tmp/grep.txt 
  -x, --line-regexp         force PATTERN to match only whole lines
  -v, --invert-match        select non-matching lines
  -b, --byte-offset         print the byte offset with output lines
  -n, --line-number         print line number with output lines

4.{m,}

查詢包含2個或者更多個S的行
[root@localhost ~]# grep  "\(s\)\{2,\}" /tmp/grep.txt 
PATTERN is, by default, a basic regular expression (BRE).
  -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
  -G, --basic-regexp        PATTERN is a basic regular expression (BRE)
  -P, --perl-regexp         PATTERN is a Perl regular expression
  -s, --no-messages         suppress error messages
  -h, --no-filename         suppress the file name prefix on output
  -q, --quiet, --silent     suppress all normal output
      --binary-files=TYPE   assume that binary files are TYPE;
-r is given, - otherwise.  If fewer than two FILEs are given, assume -h.

總結

注意使用轉義字元,如果使用正則要查詢的不是單個字元而是多個字元需要使用()把多個字元括起來,grep還有很多的使用技巧這裡就不一一列出來。

 

 

備註:

    作者:pursuer.chen

    部落格:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。

《歡迎交流討論》

 

相關文章