在linux系統有被稱爲文本處理三劍客grep,sed,awk.
今天與大家分享的就是gerp和sed處理工具,至於awk,我將會在晚些的時間與大家分享,在分享grep和sed之前我先要和大家說說正則表達,正則表達是什麼呢,正則表達式就像是三劍客手裏的劍,沒有劍哪還能稱的上什麼劍客,所以我們要先了解以下正則表達式的簡單用法。
什麼是正則表達式:
“正則表達式是描述一組字符串特徵的模式,用來匹配特定的字符串。“--Ken Thompson
基本正則表達式的元字符有以下這些:
. :匹配任意單個字符;
[]:匹配指定範圍內的任意單個字符;
如:[a-z], [A-Z], [0-9], [a-z0-9]
[:upper:]:所有大寫字母
[:lower:]:所有小寫字母
[:alpha:]:所有字母
[:digit:]:所有數字
[:alnum:]:所有的字母和數字
[:space:]:所有空白字符
[:punct:]:所有標點符號
[^]:匹配指定範圍外的任意單個字符;
匹配次數:用在要指定其出現的次數的字符的後面,用於限制其前面字符出現的次數;默認工作於貪婪模式;
*:匹配其前面的字符任意次;0,1,多次;
.*:匹配任意長度的任意字符
\?:匹配其前面的字符0次或1次;即其前面的字符是可有可無的;
\+:匹配其前面的字符1次或多次;即其面的字符要出現至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
\{0,n\}:至多n次
\{m,\}:至少m次
位置錨定:
^:行首錨定;用於模式的最左側;
$:行尾錨定;用於模式的最右側;
^PATTERN$:用於PATTERN來匹配整行;
^$:表示空白行;
^[[:space:]]*$:空行或包含空白字符的行;
單詞:非特殊字符組成的連續字符(字符串)都稱爲單詞;
\< 或 \b:詞首錨定,用於單詞模式的左側;
\> 或 \b:詞尾錨定,用於單詞模式的右側;
\<PATTERN\>:匹配完整單詞;
好的現在可以介紹grep和sed了,grep是global searchregular expression(RE) and print out the line的縮寫,光看名字這麼長就知道這是一個很厲害的工具,嘿嘿,其實它能做到對用戶所選擇的過濾條件全文搜索匹配指定文件,並把相應的行顯示出來,並且顯示的是整行。也就是說只要有部分匹配就會整行顯示。這個過濾條件可以是基本正則表達式或擴展正則表達式。正則表達式我也將會在晚些的博客中與大家分享。
grep的用法
grep[OPTIONS] PATTERN [FILE]...
grep[OPTIONS] [-e PATTERN | -f FILE] [FILE...]
這裏的PATTERN就是過濾條件,加上-e參數後就可以匹配多個條件,後面的-f表示過濾條件可以從文件中讀取。
PATTERN:可以是由正則表達式的元字符及文本字符所編寫出的過濾條件。
常用選項如下:
--color=[always|never|auto]:對提配到的文本是否高亮顯示;
-i:ignore-case,忽略字符大小寫;
-o:僅顯示匹配到的字符串本身,而不整行顯示;
-v:顯示能被匹配字符所在的行以外的所有行;
-E:支持擴展的正則表達式;
-q:靜默模式,即匹配到字符,但不顯示,一般用來判斷文件是否存在;
-Anum:num用數字替換,表示顯示匹配到的字符所在的行及後num行; -Bnum:num用數字替換,表示顯示匹配到的字符所在的行及前num行:
-Cnum:num用數字替換,表示顯示匹配到的字符所在的行及前後各num行:
以下以-A選項爲例:
grep需要和正則表達是才能發揮出威力,例如下面:
例一:顯示/etc/passwd文件中以/bin/bash結尾的行;
例二:顯示netstat -tan命令的結果中以LISTEN後跟0、1或多個空白字符結尾的行
例三:顯示/etc/grub2.cfg文件中,以至少一個空白字符開頭,且爲數字結尾的行。
grep的用法就說這麼多,基於正則表式還能組合出更多的用法,就大家研究去嘍,下面該說說sed了。
三劍客之sed。
sed是一個行編輯器,通常sed編輯文件都不是直接編輯原文件的,而是將原文件複製一份在內存中進行編輯,在sed啓動後內存空間中有一段空間pattern space和hold space,pattern space對複製來的文件進行逐行匹配,能被匹配到的我們就可以做指定編輯,sed可以對符合條件的行逐行編輯操作,也可以只對符合條件的部分進行編輯操作,處理完之後結果可以傳送到stdout(標準輸出),當然也可以選擇刪除,還可以選擇存放到hold space中,不能匹配到的可以選擇是否傳送到標準輸出。
關於sed用法:
sed[OPTIONS] ...’script’ [input-file]...
script:地址定界編輯命令,即對哪些文本,做什麼樣操作,注意地址定界和編輯命令之間沒有空格。
注意:不論是否被patternspace匹配到,默認情況下原文件都會被輸出到標準輸出。
常用選項:
-n:不輸出模式空間中的內容至屏幕;
-escript, --expression=script:多點編輯;
-f /PATH/TO/SED_SCRIPT_FILE
每行一個編輯命令,多個命令組成的文件叫做腳本文件
-r,--regexp-extended:支持使用擴展正則表達式;
-i[SUFFIX],--in-place[=SUFFIX]:直接編輯原文件 ;
表示刪除test1文件行首爲1或2位數字開頭後面跟一個符號,並只顯示刪除後行中有cd字母的行。
地址定界:
(1) 空地址:對全文進行處理;
(2) 單地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;
(3) 地址範圍
#,#:
#,+#:
#,/pat1/
/pat1/,/pat2/
$:最後一行;
(4) 步進:~ 左邊數字爲其實行,右邊數字爲步長,即每次匹配加幾行如:1~2表示所有的奇數行。
編輯命令:
d:刪除匹配模式匹配到的行;
p:顯示模式空間中的內容;
這裏第五行被顯示了兩遍,因爲默認情況下pattern space空間中的內容也是會被輸出的,-p之後又會被顯示一遍,所以這裏出現了兩次第五行的內容。
a \text:在行後面追加文本“text”,支持使用\n實現多行追加;
i \text:在行前面插入文本“text”,支持使用\n實現多行插入;
c \text:把匹配到的行替換爲此處指定的文本“text”;
w/PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行後面;文件合併;
=:爲模式匹配到的行打印行號;
!:條件取反;
地址定界!編輯命令;
s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等;
替換標記:
g:全局替換;
w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
p:顯示替換成功的行;
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
g:把保持空間中的內容覆蓋至模式空間中;
G:把保持空間中的內容追加至模式空間中;
x:把模式空間中的內容與保持空間中的內容互換;
n:覆蓋讀取匹配到的行的下一行至模式空間中;
N:追加讀取匹配到的行的下一行至模式空間中;
d:刪除模式空間中的行;
D:刪除多行模式空間中的所有行;
有興趣的可以自行研究研究。