正則表達式:是一套處理字符串的規則和方法。以行爲單位對字符串進行處理。可以快速過濾替換某些特定字符串。
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}\>'