文本處理工具:
Linux文本處理三劍客:
grep、egrep、fgrep:文本過濾工具(模式:pattern)工具
grep:基本正則表達式 -E -F
egrep:擴展正則表達式 -G -F
fgrep:不支持正則表達式 -E -G 僅僅進行字符匹配,沒有模式只有文本,推薦使用速度快
sed:stream editor,流編輯器;文本編輯工具
gawk(awk):Linux上的實現為gawk,文本報告生成器(格式化文本)
正則表達式:Regual Expression,REGEXP
有一類特殊字符及文本字符所編寫的模式,其中有些字符不表示其字面意義,而是用于表示控制或通配的功能
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
元字符:不能夠被切割,表示控制和通配的功能
grep:Global search REgular expression and Print out the line.
作用:文本搜索工具,根據用戶指定的“模式(過濾條件)”對目標文本逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式的元字符及文本字符所編寫出的過濾條件;
正則表達式引擎
grep:
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
OPTIONS:
–color=auto:對匹配到的文本著色后高亮顯示
-i:ignore-case:忽略字符的大小寫
-o:僅顯示匹配到的字符串本身
-v:–invert-match:顯示不能被模式匹配到的行
-E:支持使用擴展的正則表達式元字符
-q,–quiet,–silent:靜默模式,既不輸出任何信息(匹配到就匹配返回值0,沒匹配到就不匹配返回值1)
-A#:after,后#行
-B#:before,前#行
-C#:context,前后各#行
基本正則表達式元字符:
字符匹配:
.:匹配任意單個字符
[]:匹配指定范圍內的任意單個字符;
[^]:匹配指定范圍外的任意單個字符
以上[]當中的范圍有以下幾種表示方法:
[:digit:]:表示所有數字
[:lower:]:表示所有小寫字母
[:upper:]:表示所有大寫字母
[:alpha:]:表示所有大小寫字母
[:alnum:]:表示所有字母和數字
[:punct:]:表示所有的標點符號
[:space:]:表示所有的空白字符
[:graph:]:匹配打印字符。[[:graph:]] 等效于 [[:alnum:][:punct:]]。
[:cntrl:]:匹配順序值小于32或字符值為127的ASCII字符(控制字符)??刂谱址〒Q行符、換頁符、退格符,等等。
[:xdigit:]:匹配字符類[0-9A-Fa-f]中的字符
[:print:]:匹配打印字符和空格。[[:print:]]等效于[[:graph:][:space:]]
匹配次數:用在要指定其出現的次數的字符的后面,用于限制其前面字符出現的次數;
*:匹配前面的字符任意次
.*:匹配任意長度的任意字符
\?:匹配其前面的字符0或1次,即前面的可有可無;
\+:匹配其前面的字符至少1次
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{0,n\}:匹配前面的字符至多n次
\{m,\}:匹配前面的字符至少m次
位置錨定:
^:行首錨定:用于模式的最左側;
$:行尾錨定:用于模式的最右側;
^PATTERN$:用于PATTERN來匹配整行
^$:空行;不包括空白字符的行
^[[:space:]]*$:空白行或包含空白字符的行
單詞:非特殊字符組成的連續字符(字符串)都稱為單詞
\<或\b:詞首錨定,用于單詞模式的左側
\>或\b:詞尾錨定,用于單詞模式的右側
\<PATTERN\>:匹配完整單詞;
練習:
1、顯示/etc/passwd文件中不以/bin/bash結尾的行;
group -v "/bin/bash$" /etc/passwd
2、找出/etc/passwd文件中兩位或三位數;
group "\<[0-9]\{2,3\}\>" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個空白字符開頭,且后面非空白字符的行
group "^[[:space:]]\+[^[space]]" /etc/grub2.cfg
4、找出"netstat-tan"命令的結果中以'LISTEN'后面跟0、1或多個空白字符結尾的行
netstat -tan |grep "LISTEN[[:space:]]*$"
分組及引用:
\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理
Note:分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部的變量中,這些變量為:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
\3:模式從左側起,第三個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
…
后向引用:引用前面的分組括號中的模式所匹配到的字符,而非模式本身
egrep:支持擴展的正則表達式實現類似于grep文本過濾功能;grep -E
egrep [OPTIONS] PATTERN [FILE…]
egrep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
選項:
OPTIONS:
–color=auto:對匹配到的文本著色后高亮顯示
-i:ignore-case:忽略字符的大小寫
-o:僅顯示匹配到的字符串本身
-v:–invert-match:顯示不能被模式匹配到的行
-E:支持使用擴展的正則表達式元字符
-q,–quiet,–silent:靜默模式,既不輸出任何信息(匹配到就匹配返回值0,沒匹配到就不匹配返回值1)
-A#:after,后#行
-B#:before,前#行
-C#:context,前后各#行
擴展正則表達式元字符:
字符匹配:
.:匹配任意單個字符
[]:匹配指定范圍內的任意單個字符;
[^]:匹配指定范圍外的任意單個字符
以上[]當中的范圍有以下幾種表示方法:
[:digit:]:表示所有數字
[:lower:]:表示所有小寫字母
[:upper:]:表示所有大寫字母
[:alpha:]:表示所有大小寫字母
[:alnum:]:表示所有字母和數字
[:punct:]:表示所有的標點符號
[:space:]:表示所有的空白字符
[:graph:]:匹配打印字符。[[:graph:]] 等效于 [[:alnum:][:punct:]]。
[:cntrl:]:匹配順序值小于32或字符值為127的ASCII字符(控制字符)??刂谱址〒Q行符、換頁符、退格符,等等。
[:xdigit:]:匹配字符類[0-9A-Fa-f]中的字符
[:print:]:匹配打印字符和空格。[[:print:]]等效于[[:graph:][:space:]]
匹配次數:用在要指定其出現的次數的字符的后面,用于限制其前面字符出現的次數;
*:匹配前面的字符任意次
?:匹配其前面的字符0或1次,即前面的可有可無;
+:匹配其前面的字符至少1次
{m}:匹配其前面的字符m次
{m,n}:匹配其前面的字符至少m次,至多n次
{0,n}:匹配前面的字符至多n次
{m,}:匹配前面的字符至少m次
分組及引用:
():將一個或多個字符捆綁在一起,當作一個整體進行處理
Note:分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部的變量中,這些變量為:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
\3:模式從左側起,第三個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
…
后向引用:引用前面的分組括號中的模式所匹配到的字符,而非模式本身
或
a|b:a或者b;
C|cat:C或cat
(C|c)at:Cat或cat
練習:
1、找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行;至少有三種實現方式;
grep -i "^s" /proc/memsinfo
grep "^[Ss]" /proc/memsinfo
egrep "^(S|s)" /proc/memsinfo
2、顯示當前系統上root、centos或user1用戶的相關信息;
egrep "^(root|centos|user1)\>" /etc/passwd
3、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一個小括號的行
egrep -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
4、使用echo命令輸出一個絕對路徑,使用egrep取出基名;
echo "/tmp/dir"|egrep -o "[^/]+/?$"
echo "/tmp/dir"|grep -o "[^/]\+\/\?$"
進一步:取出其路徑;類似于對其執行dirname命令的結果
5、找出ifconfig命令結果中的1-255之間的數值;
ifconfig|egrep -o "\<[1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\>"
6、添加用戶bash,testbash,basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行
egrep "^(bash|testbash|basher|nologin):.*\1$" /etc/passwd
egrep "^(bash|testbash|basher|nologin)\b.*\1$" /etc/passwd
egrep "^([^:]+\>).*\1$" /etc/passwd
fgrep:不支持正則表達式元字符
當無需要用到元字符去編寫模式時,使用fgrep必能更好;
文本查看及處理工具:wc、cut、sort、uniq、diff、patch
wc:word count顯示每個文件的換行符、 字和字節計數
wc [OPTION]… [FILE]…
wc [OPTION]… –files0-from=F
顯示數據含義:
行數 單詞數 字節數
-l:僅lines行數
-w:僅works單詞數
-c:僅bytes字節數
cut:從文件的每一行中刪除節
cut OPTION… [FILE]…
-dCHAR:以指定的字符為分隔符,默認為空白字符例如-d:、-d|
-fFIELDS:挑選出的字符
#:顯示第#行
#-#:顯示#到#行
#,#:顯示#和#行
sort:按行排序
sort [OPTION]… [FILE]…
sort [OPTION]… –files0-from=F
-n:基于數值大小而非字符進行排序
-t CHAR:指定分隔符
-k#:用于排序比較的字段
-r:逆序排序
-f:忽略字符大小寫
-u:重復的行只保留一份(重復:連續且相同)
uniq:報告或忽略重復的行
uniq [OPTION]… [INPUT [OUTPUT]]
-c:統計每行重復的次數
-u:僅顯示未重復的行
-d:僅顯示重復過的行
diff:逐行比較文件(生成補?。?/p>
diff [OPTION]… FILES
-u:使用unfied機制,即顯示要修改的行的上下文,默認為3行
diff /PATH/TO/OLDFILE /PATH/TONEWFILE >/PATH/TO/PATCH_FILE
例如 :diff file file.new > file.patch
patch:補丁更改應用的文件(向文件打補?。?/p>
patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile][-o outfile][-p num][-r rejectfile][file]
patch [OPTIAONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE
patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE
安裝patch:yum install patch
-i:打補丁
patch -i file.patch file
-R:還原補丁
patch -R -i file.patch file
原創文章,作者:NameLess,如若轉載,請注明出處:http://www.www58058.com/31834