grep和正則表達式

正則表達式:是一套處理字符串的規則和方法。以行爲單位對字符串進行處理。可以快速過濾替換某些特定字符串。

linux下文本處理的三劍客:

awk   sed   grep(egrep)

 

grep   grep爲global search regular expression(RE) and print out the line的縮寫,即根據用戶指定的文本搜索模式對目標文件進行搜索並顯示能夠被模式匹配到的行的一種文本搜索工具。

       

grep [OPTIONS] PATTERN [FILE...]

       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]       grep [OPTIONS] PATTERN [FILE...]

       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

 

-i 忽略大小寫 
[root@redmine ~]# grep -i --color 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROOT
[root@redmine ~]#

 

-c 顯示被匹配到的行數 

 

[root@redmine ~]#  grep -c --color 'root' /etc/passwd
2
[root@redmine ~]#

 

-n 輸出行號 

 

[root@redmine ~]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin

 

-v 反向選擇,即找沒有搜索字符串的行 

 

[root@redmine ~]# grep -v '^r' /etc/passwd

 

-o 僅顯示匹配到的內容 

 

[root@redmine ~]# grep -o 'root' /etc/passwd
root
root
root
root
[root@redmine ~]#

 

-w 匹配單詞 

 

-A # 連同匹配行的下#行一併顯示,#代表任意數字 

[root@redmine ~]# grep -A2 "postfix" /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@redmine ~]#

 

 

 

-B # 連同匹配行的上#行一併顯示,#代表任意數字 

 

[root@redmine ~]# grep -B2 "postfix" /etc/passwd
apache:x:48:48:Apache:/var/www:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@redmine ~]#

 

 

-C # 連同匹配行的上下#行一併顯示,#代表任意數字 

[root@redmine ~]# grep -C2 "postfix"  /etc/passwd
apache:x:48:48:Apache:/var/www:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@redmine ~]#

 

-R或-r 遞歸搜索目錄或子目錄下匹配的字所在文件(可配合find命令 

[root@redmine etc]# grep -r "yuanyang" /etc/
/etc/passwd:yuanyang
/etc/ssh/sshd_config:yuanyang
[root@redmine etc]#

 

-E 相當於egrep 支持擴展的正則表達式 

 

-F  相當於fgrep 不支持正則表達式 

 

--color對匹配的內容以顏色顯示,等價於如下命令,在redhat發行版7.0中默認就有,不用額外執行。

[root@redmine ~]# alias grep='grep --color=auto'

 

-V  顯示grep版本 

[root@redmine etc]# grep -V

grep (GNU grep) 2.20

Copyright (C) 2014 Free Software Foundation, Inc.

GPLv3+ 許可證: GNU 通用公共許可證第三版或更高版本 <http://gnu.org/licenses/gpl.html>。

這是自由軟件: 您可自由更改並重新分發它。

在法律所允許的範圍內,不附帶任何擔保條款。

 

作者 Mike Haertel 和 其餘作者請參看 <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>。

 

 

grep中不太常用的選項: 

 

-P, --perl-regexp        PATTERN 是一個 Perl 正則表達式 

 

-q 取消顯示,只返回退出狀態。0則表示找到了匹配的行;找不到返回1,搜索的文件不存在返回2 

 

-h --no-filename  #在顯示符合樣式的那一列之前,不標示該列所屬的文件名稱。 

 

-H  --with-filename  #在顯示符合樣式的那一列之前,表示該列所屬的文件名稱。(默認方式) 

 

 -L:輸出時只顯示不包含匹配項的文件名,通常與-r選項連用來查找帶指定內容的文件。 

 

-l:輸出時只顯示包含匹配項的文件名。

 

基礎正則表達式

1)"^以什麼開頭的行"

 "^root"以root開頭的  如:grep  "^root" /etc/passwd

[root@redmine etc]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rootadbed123o
[root@redmine etc]#

 

2)"$"以什麼結尾的行

"bash$"以bash結尾的  如:grep  "bash$" /etc/passwd

[root@redmine etc]# grep "bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
yy:x:500:500:yy:/home/yy:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
[root@redmine etc]#

3). 代表任意一個字符      如:grep  "r..t" /etc/passwd

[root@redmine etc]# grep "r..t"  /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
rootadbed123o
raat
[root@redmine etc]#

 

 

4)\              轉義符號,讓有特殊身份意義的字符還原型。 例:\.

 

5)\.表示.本身   \逃逸符   如:

[root@redmine etc]# grep "^r\." /etc/passwd
r....t
r...
r..bt
[root@redmine etc]#

 

   \? 匹配其前面字符1次或0次

[root@redmine etc]# grep "ro\?t" /etc/passwd
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rot

6)* 重複0個或多個前面的字符。  如:grep  "ro*t" /etc/passwd

[root@redmine etc]# grep 'ro*t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rooooot
rooot
rootadbed123o
rot
[root@redmine etc]#

7).*匹配所有字符。^.*以任意多個字符開頭。

 

8)[]字符集合的重複特殊字符符號   如grep b[lo]g,表示匹配blg或bog

[root@redmine etc]# grep "[Rr].*[tT]" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rooooot
rooot
r....t
ROOOT
ROOT
rOOOt
RoooT
rootadbed123o
raat
rbbbt
r..bt
rot

 

8)[^]匹配不包含^後的任意字符的內容。如[^0-9]表示匹配非數字的內容。

grep '[^0-9]' /etc/passwd  表示匹配文件中所有的非數字內容。

grep '[^a-Z]' /etc/passwd  表示匹配文件中所有非字母的內容。

9)a\{n,m\}  匹配前面的a最少n次,最多m次。,如果用egrep可以去掉斜線

[root@redmine etc]# grep "ro\{1,3\}t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rooot
rootadbed123o
rot
[root@redmine etc]#

x\{m,n\}:匹配其前面的字符“x”至少m 次,至多n 次 ,同上;

 

 

  \{n,\}重複前面一個字符至少n次。

[root@redmine etc]# grep 'ro\{3,\}t' /etc/passwd
rooooot
rooot
[root@redmine etc]#

x\{m,\}:匹配其前面的字符“x”至少m 次 ,同上;

  \{n\}重複前面一個字符n次。

[root@redmine etc]# grep 'ro\{3\}t' /etc/passwd
rooot
[root@redmine etc]#

x\{m\}:匹配其前面的字符“x”m 次(精確匹配) ,同上;

 

 x\{1,\} 1次至無上限 

[root@redmine etc]# grep "ro\{1,\}t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rooooot
rooot
rootadbed123o
rot
[root@redmine etc]#

 

 

 

位置錨定:

 

  ^ 錨定行首,此字符後面的任意內容必須出現在行首  

 

 

    $ 錨定行尾,次字符前面的任意內容必須出現在行尾  

 

    ^$表示空行

grep -v '^$' xxx  表示過濾文件中的空行。

 

    [ ] 匹配指定範圍內的任意單個字符 

 

    [^ ] 匹配指定範圍外的任意單個字符 

以上幾個位置錨定前面有示例,不再贅述。

 

    \< 其後面的任意字符必須作爲單詞的首部出現 或用 \b 

[root@redmine etc]# grep '\<p' /etc/passwd
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
[root@redmine etc]# 
[root@redmine etc]# grep '\bp' /etc/passwd
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
[root@redmine etc]#

 

    \> 其前面的任意字符必須作爲單詞的尾部出現 或 \b 

[root@redmine etc]# grep 't\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rooooot
rooot
r....t
rOOOt
raat
rbbbt
r..bt
rot
[root@redmine etc]# grep 't\b' /etc/passwd
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rooooot
rooot
r....t
rOOOt
raat
rbbbt
r..bt
rot

 

    \<\> 錨定單詞例如 \<root\> ,注意,這裏的單詞和詞典上定義的單詞概念有所不同。這裏的單詞是指一個由連續的字母,數字和一些符號組成的字符串。例如:”asd!@#-asd_%123”

[root@redmine etc]# grep '\<asd!@#-asd_%123\>' /etc/passwd
asd!@#-asd_%123

 

字符集合表示:

純數字 [[:digit:]]或[0-9] 

 

    小寫字母 [[:lower:]]或[a-z] 

 

    大寫字母 [[:upper:]]或[A-Z] 

 

    大小寫字母 [[:alpha:]]或[a-zA-Z] 

 

    數字加字母 [[:alnum:]]或[0-9a-zA-Z] 

 

    空白字符 [[:space:]]  非空白字符[^[:space:]] 

 

    標點符號 [[:punct:]] 

 

\d  匹配任何十進制數,相當於[0-9]     -P選項加上 

 

 \D 匹配任何非數字字符,相當於[^0-9]    -P選項加上 

 

 \s  匹配任何空白字符, 

 

  \S  匹配任何非空白字符, 

 

 \w  匹配任何字母數字字符,相當於[a-zA-Z0-9] 

 

 \W 匹配任何非字母數字字符,相當於[^a-zA-Z0-9] 

 

 \\  匹配"\" 

 

 \( \) 分組後項引用  \1 引用第一個左括號以及與之對應的右括號所包括的所有內容。    \2 \3 … 

 

 

 

擴展正則表達式

1)+重複一個或一個以上前面的字符  grep -E 'ro+t' /etc/passwd

[root@redmine etc]# grep -E 'ro+t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rooooot
rooot
rootadbed123o
rot

 

2)?重複0個或一個前面的字符

[root@redmine etc]# grep -E 'ro?t' /etc/passwd
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rot

3)|用或的方式查找多個符合的字符串,如egrep "3306|1521" /etc/service

[root@redmine etc]# grep -E 'root|yuanyang' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
yuanyang
rootadbed123o
[root@redmine etc]#

4)()找出用戶組字符串  grep -E 'r(oo|aa)t' /etc/passwd

[root@redmine etc]# grep -E 'r(oo|aa)t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rootadbed123o
raat

()+ 多個重複組的判斷  匹配 AabcabcabcC 中間abc爲多組  grep -E 'A(abc)+C' test

 

 

實例演示:

1.顯示/etc/passwd文件中以bash結尾的行

[root@redmine etc]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
yy:x:500:500:yy:/home/yy:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

 

2.顯示/etc/passwd文件中的兩位數或三位數

[root@redmine etc]# grep -o --color '[0-9]\{2,3\}' /etc/passwd 
12
10
14
11
12
100
13
30
14
50
99
99

.................由於篇幅問題,後面不列舉出來。

 

3.顯示`netstat -tan`命令結果中以‘LISTEN’後跟0個、1個或者多個空白字符結尾的行

netstat -tan | grep 'LISTEN[[:space:]]*$'

 

4.添加用戶bash、testbash、basher以及nologin用戶(nologin用戶的shell爲/sbin/nologin);而後找出/etc/passwd文件中用戶名與其shell名相同的行

 

[root@redmine etc]# useradd bash;useradd testbash;useradd basher;useradd nologin -s /sbin/nologin
[root@redmine etc]# grep -E '(^[[:alnum:]]+\>).*\1$' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:501:501::/home/bash:/bin/bash
nologin:x:504:504::/home/nologin:/sbin/nologin

 

 

5.顯示當前系統上root、centos或者user1用戶的默認shell和UID (請事先創建這些用戶,若不存在)

[root@redmine etc]# useradd centos;useradd user1
[root@redmine etc]#  grep -E '^root|^centos|^user1' /etc/passwd | cut -d: -f1,3,7
root:0:/bin/bash
rootadbed123o
centos:505:/bin/bash
user1:506:/bin/bash

 

 

6.找出/etc/rc.d/init.d/functions文件中某單詞(單詞中間可以存在下劃線)後面跟着一組小括號的行

 

[root@redmine etc]# grep -E '\w+\(\)' /etc/rc.d/init.d/functions 
fstab_decode_str() {
checkpid() {
__readlink() {
__fgrep() {
__umount_loop() {
__umount_loopback_loop() {
__pids_var_run() {
__pids_pidof() {
daemon() {
killproc() {
pidfileofproc() {

..............

 

 

7.使用echo輸出一個路徑,而後egrep找出其路徑基名;進一步的使用egrep取出其目錄名

[root@redmine etc]#  echo /etc/init.d/functions | grep -oE '[^/]+/?*$'
functions
[root@redmine etc]# echo /etc/init.d/functions | grep '^[/].*[/]'
/etc/init.d/functions

 

 

 

8.找出ifconfig命令執行結果中1-255之間的數字

[root@redmine etc]# ifconfig | grep -Eo '\<[1-9]\>|\<[0-9\]{2}\>|\<[0-9]{3}\>'


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章