linux上文本處理三劍客
grep,sed和awk都是文本處理工具,雖然都是文本處理工具但卻都有各自的優缺點,一種文本處理命令時不能被另一個完全替換的,否則也不會出現三個文本處理命令了。
grep:stream editor,文本過濾器,如果僅僅是過濾文本,可使用grep,其效率要比其他的高很多;
sed:Stream EDitor,流編輯器,默認只吃力模式空間,不處理原數據,針對行進行處理;
awk:報告生成器,格式化以後顯示。如果對處理的數據需要生成報告之類的信息,或者你處理的數據是按列進行處理的,最好使用awk。
grep
Global search REgular expression and Print out the line
作用:文本搜索工具,根據用戶指定的“模式“對文本主行進行匹配,打印匹配到的行;
模式:由正則表達式字符及文本字符所編寫的過濾條件;
REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些不表示字符字面意義,而標示控制或統配的功能;
grep [options] pattern [file]
選項:
--color=auto:對匹配到的文本進行着色顯示;
-v:顯示不能被pattern匹配到的行;
-i:忽略字符大小寫;
-o:僅顯示匹配到的字符串
-q:靜默模式,不輸出任何信息;
-A #:after,後#行;
-B #:before。前#行;
-C #:context,前後各#行;
基本正則表達式元字符:
字符匹配:
. 匹配任意單個字符;
[] 匹配指定範圍內的任意單個字符;
[^] 匹配指定範圍外的任意單個字符;
[:digit:] [:lower:] [:upper:] [:alpha:] [:punct:] [:space:]
匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數;
*:匹配前面的字符任意次;
例如:grep “x*y“
abxy
xay
xxxxxxy
貪婪模式
.*:任意長度的任意字符;
\?:匹配其前面的字符0或1次,即前面的字符可有可無;
\+:匹配其前面的字符至少一次
\{m}:匹配前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{0,n\}:匹配前面的字符至多n次;
\{m,\}:匹配前面的字符至少m次;
位置錨定:
^: 行首錨定;用於模式的最左側;
$: 行尾錨定;用於模式的最右側;
^PATTERN$: 用於模式匹配整行;
^$ ^[[:space:]]*$
\< 或 \b:詞首錨定;用於單詞模式的左側;
\> 或 \b:詞尾錨定;用於單詞模式的右側;
\<PATTERN\>:匹配整個單詞;
分組:
\(\): 將一個或多個字符捆綁在一起,當作一個整體進行處理;
\(xy\)*ab
Note:分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1 \2 \3..
\1:從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1: ab\+\(xy\)* \2: xy
後向引用:引用前面的分組括號中的模式所匹配字符,(而非模式本身)
練習:
1 顯示/proc/meminfo文件中以大小s開頭的行;
grep -i '^s' /proc/meminfo
grep ^[sS] /proc/meminfo
grep -e ^s -e ^S /proc/meminfo
2 顯示/etc/passwd文件中不以/bin/bash結尾的行;
grep -v '/bin/bash$' /etc/passwd
3 顯示/etc/passwd文件中ID號最大的用戶的用戶名;
sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1
4 如果root用戶存在,顯示默認的shell程序;
grep '^root' /etc/passwd | cut -d: -f7
5 找出/etc/passwd中的兩位或三位數;
grep '\<[[:digit:]]\{2,3\}\>' /etc/passwd
6 顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且後面存在非空白字符的行;
grep '^[[:space:]]\+[^[:space:]]' /etc/rc.d/rc.sysinit
7 找出“netstat -tan“命令的結果中以“LISTEN“後跟0,1或多個空白字符結尾的行;
netstat -tan | grep 'LISTEN[[:space:]]*$'
8 添加用戶bash,testbash,bashrc以及noligin(其shell爲/sbib/nologin);而後找
出/etc/passwd文件中用戶名同shell名的行;
grep '^\(\<[[:alnum:]]\+\>\).*/\1$' /etc/passwd