grep:
Linux上文本處理三劍客 grep:文本過濾(模式:pattern)工具; grep: Global search REgular expression and Print out the line. 作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行; 模式:由正則表達式字符及文本字符所編寫的過濾條件; REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示字符字面意義,而表示控制或通配的功能; 分兩類: 基本正則表達式:BRE 擴展正則表達式:ERE grep -E, egrep
grep家族主要有grep(基本正則)、egrep(擴展正則)、fgrep(不支持正則)
grep [OPTIONS] PATTERN [FILE…]
選項: --color=auto: 對匹配到的文本著色顯示;centos 7默認帶-v: 顯示不能夠被pattern匹配到的行;-i: 忽略字符大小寫;-o: 僅顯示匹配到的字符串;-q: 靜默模式,不輸出任何信息;-A #:after, 后#行-B #: before, 前#行-C #:context, 前后各#行-R/-r: 此參數的效果和指定“-d recurse”參數相同-n :在顯示符合范本樣式的那一列之前,標示出該列的編號-E:使用ERE;
選項例子: 在多個文件中查找:
grep "match_pattern" file_1 file_2 file_3 ... 標記匹配顏色 --color=auto 選項 grep "match_pattern" file_name --color=auto忽略字符大小寫 grep -i "^s" /proc/meminfo 僅顯示匹配到的字符串 grep -o "^[sS]" /proc/meminfo 靜默模式 grep -q "test" filename#不會輸出任何信息,如果命令運行成功返回0,失敗則返回非0值。一般用于條件測試。顯示匹配某個結果之后的3行,使用 -A 選項: seq 10 | grep "5" -A 35678 顯示匹配某個結果之前的3行,使用 -B 選項 seq 10 | grep "5" -B 32345顯示匹配某個結果的前三行和后三行,使用 -C 選項 seq 10 | grep "5" -C 32345678使用擴展正則 grep -E "[1-9]+" 或 egrep "[1-9]+"在多級目錄中對文本進行遞歸搜索 grep "text" . -r -n # .表示當前目錄。 在grep搜索結果中包括或者排除指定文件#只在目錄中所有的.php和.html文件中遞歸搜索字符"main()"grep "main()" . -r --include *.{php,html}#在搜索結果中排除所有README文件 grep "main()" . -r --exclude "README"#在搜索結果中排除filelist文件列表里的文件 grep "main()" . -r --exclude-from filelist
基本正則表達式
字符匹配: .:匹配任意單個字符[]:匹配指定范圍內的任意單個字符[^]:匹配指定范圍外的任意單個字符[-]:匹配[]中指定范圍內的任意一個字符,要寫成遞增 POSIX字符類:[:digit:]:匹配任意一個數字字符[:lower:]:匹配小寫字母[:upper:]:匹配大寫字母[:alpha:]:匹配任意一個字母字符(包括大小寫字母)[:alnum:]:匹配任意一個字母或數字字符[:space:]:匹配一個包括換行符、回車等在內的所有空白符[:punct:]:匹配標點符號\:轉義符,將特殊字符進行轉義,忽略其特殊意義 匹配次數: *:匹配前面的字符任意次 .*:任意長度的任意字符\?:匹配其前面的字符0或1次;即前面的可有可無\+:匹配其前面的字符至少1次;\{m\}:匹配前面的字符m次;\{m,n\}:匹配前面的字符至少m次,至多n次;\{0,n\}:匹配前面的字符至多n次;\{m,\}:匹配前面的字符至少m次; 位置錨定: ^:行首錨定;用于模式的最左側;$:行尾錨定;用于模式的最右側; ^PATTERN$: 用于模式匹配整行; ^$: 空行; ^[[:space:]]*$:空白行 單詞錨定:\< 或 \b:詞首錨定;用于單詞模式的左側;\> 或 \b:詞尾錨定;用于單詞模式的右側;\<PATTERN\>:匹配整個單詞; 分組: 分組:\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理;\(xy\)*ab Note: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, ... \1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符; \2:從左側起,第:二個左括號以及與之匹配右括號之間的模式所匹配到的字符;\(ab\+\(xy\)*\): \1: ab\+\(xy\)* \2: xy 后向引用:引用前面的分組括號中的模式所匹配字符,(而非模式本身)
例題:
1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式) grep "^[sS]" /proc/meminfo grep -i "^s" /proc/meminfo2、顯示/etc/passwd文件中不以/bin/bash結尾的行; grep -v "/bin/bash$" /etc/passwd3、顯示/etc/passwd文件中ID號最大的用戶的用戶名; sort -t: -k 3 /etc/passwd | cut -d: -f 1 | tail -n 1 4、如果用戶root存在,顯示其默認的shell程序; id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f75、找出/etc/passwd中的兩位或三位數; grep "\<[0-9]\{2,3\}\>" /etc/passwd6、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且后面存非空白字符的行; grep "^[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit7、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行; netstat -tan | grep "LISTEN[[:space:]]*$"8、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行; grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd9、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶; grep -v "/sbin/nologin$" /etc/passwd10、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶; grep "/bin/bash$" /etc/passwd11、找出/etc/passwd文件中的一位數或兩位數 grep --color=auto "\b[0-9]\{1,2\}\b" /etc/passwd12、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行; grep "^[:space:]\+[^[:space:]]" /boot/grub/grub.conf13、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;grep "^#.*[:space:]\+[^[:space:]]" /boot/grub/grub.conf14、使用echo命令輸出一個絕對路徑,使用grep取出其基名; echo "/etc/passwd/" | grep -o "[[:alpha:]]\+" | tail -n 1擴展:取出其路徑名 echo "/etc/passwd" | sed 's@[^/]\+/\?$@@'
擴展正則表達式:
字符匹配 .:匹配任意單個字符 []:匹配指定范圍內的任意單個字符 [^]:匹配指定范圍外的任意單個字符 [-]:匹配[]中指定范圍內的任意一個字符,要寫成遞增 POSIX字符類: [:digit:]:匹配任意一個數字字符 [:lower:]:匹配小寫字母 [:upper:]:匹配大寫字母 [:alpha:]:匹配任意一個字母字符(包括大小寫字母) [:alnum:]:匹配任意一個字母或數字字符 [:space:]:匹配一個包括換行符、回車等在內的所有空白符 [:punct:]:匹配標點符號 \:轉義符,將特殊字符進行轉義,忽略其特殊意義 匹配次數:*:匹配前面的字符任意次.*:任意長度的任意字符 ?:匹配其前面的字符0或1次;即前面的可有可無 +:匹配其前面的字符至少1次; {m}:匹配前面的字符m次; {m,n}:匹配前面的字符至少m次,至多n次; {0,n}:匹配前面的字符至多n次; {m,}:匹配前面的字符至少m次; 位置錨定: ^:行首錨定;用于模式的最左側; $:行尾錨定;用于模式的最右側; ^PATTERN$: 用于模式匹配整行; ^$: 空行; ^[[:space:]]*$:空白行 單詞錨定: \< 或 \b:詞首錨定;用于單詞模式的左側; \> 或 \b:詞尾錨定;用于單詞模式的右側; \<PATTERN\>:匹配整個單詞; 分組: 分組: ():將一個或多個字符捆綁在一起,當作一個整體進行處理; (xy)*abNote: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, ... \1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符; \2:從左側起,第:二個左括號以及與之匹配右括號之間的模式所匹配到的字符; 后向引用:引用前面的分組括號中的模式所匹配字符,(而非模式本身) 或者: a|b C|cat: C或cat
例題:
1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用三種方式) egrep "^[sS]" /proc/meminfo egrep -i "^s" /proc/meminfo egrep "^(s|S)" /proc/meminfo2、顯示/etc/passwd文件中不以/bin/bash結尾的行; egrep -v "/bin/bash$" /etc/passwd3、顯示/etc/passwd文件中ID號最大的用戶的用戶名; sort -t: -k 3 /etc/passwd | cut -d: -f 1 | tail -n 1 4、如果用戶root存在,顯示其默認的shell程序; id root &> /dev/null && egrep "^root\>" /etc/passwd | cut -d: -f75、找出/etc/passwd中的兩位或三位數; egrep "\<[0-9]{2,3}\>" /etc/passwd6、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且后面存非空白字符的行; egrep "^[[:space:]]+[^[:space:]]" /etc/rc.d/rc.sysinit7、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行; netstat -tan | egrep "LISTEN[[:space:]]*$"8、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行; egrep "^([[:alnum:]]+\>).*\1$" /etc/passwd9、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶; egrep -v "/bin/nologin" /etc/passwd 8、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶;9、找出/etc/passwd文件中的一位數或兩位數; egrep "\b[0-9]{1,2}\b" /etc/passwd10、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行; egrep "[:space:]+[^[:space:]]" /boot/grub/grub.conf11、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;egrep "^#+[:space:]+[^[:space:]]" /boot/grub/grub.conf12、打出netstat -tan命令執行結果中以‘LISTEN’,后或跟空白字符結尾的行; egrep "^#.*[:space:]+[^[:space:]]" /boot/grub/grub.conf13、使用echo命令輸出一個絕對路徑,使用grep取出其基名; echo "/etc/passwd/" | egrep -o "[[:alpha:]]+" | tail -n 1擴展:取出其路徑名 echo "/etc/passwd" | sed 's@[^/]\+/\?$@@'14、顯示當前系統root、centos或user1用戶的默認shell和UID; egrep '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,715、找出/etc/rc.d/init.d/functions文件(centos6)中某單詞后面跟一個小括號的行; egrep -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions16、找出ifconfig命令結果中的1-255之間數字; ifconfig |egrep "\b[1-9][0-9]?\b|\b1[0-9]{2}\b|\b2[0-4][0-9]\b|\b25[0-5]\b"17、挑戰題:寫一個模式,能匹配合理的IP地址; ifconfig |egrep "(\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>"18、挑戰題:寫一個模式,能匹配出所有的郵件地址 egrep "[[:alnum:]]+_?[[:alnum:]]+@[[:alnum:]]+\.[[:alpha:]]+\.?[[:alpha:]]+?" abc
原創文章,作者:N21_ Dominic,如若轉載,請注明出處:http://www.www58058.com/50231