我們經常會遇到從一個文件中查找某些信息或從一個日誌文件中查找信息的處理文本文件的需求,本文介紹一下linux中處理文本工具的三劍客之中的grep和sed,在介紹之前,先介紹一下正則表達式:
正則表達式由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示其字面意義,而是用於表示控制或通配的功能
其中,基本正則表達式的元字符可以分爲以下幾種:
匹配字符:
.:匹配任意單個字符
[]:匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
匹配次數:用在要指定其出現的次數的字符的後面,用於限制其前面字符出現的次數;默認工作於貪婪模;
*:匹配前面的字符任意次;0次、1次或多次
.*:匹配任意長度的任意字符
\?:匹配其前面的字符0次或1次,即其前面的字符是可有可無的
\+:匹配其前面的字符一次或多次,即其前面的字符至少出現一次
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{0,n\}:至多n次
\{m,\}:至少m次
位置錨定:
^:行首錨定;用於模式的最左側
$:行尾錨定;用於模式的最右側
^PATTERN$:用於PATTERN來匹配整行
^$:空白行
^[[:space:]]*$:空行或包含空白字符的行
單詞:非特殊字符組成的連續字符(字符串)都稱爲單詞;
\<或\b:詞首錨定,用於單詞模式的左側;
\>或\b:詞尾錨定,用於單詞模式的右側;
\<PATTERN\>:匹配完整單詞
grep命令:
作用:文本搜索工具,根據用戶指定的"模式(過濾條件)"對目標文件逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式的元字符及文本字符所編寫出的過濾條件;
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE][FILE...]
常用選項:
--color=auto:對匹配到的文本着色後高亮顯示;
比如:查找/woniu/testz.txt文件中包含有his的那一行,並對匹配到的文本着色後高亮顯示;
-i:ignorcase,忽略字符的大小寫;
比如:查找/woniu/testz.txt文件中包含有he或He的那一行;
-o:只顯示匹配到的字符串本身
比如:查找/woniu/testz.txt文件中包含有he的那一行;
-v:顯示不能被模式匹配到的行
比如:查找/woniu/testz.txt文件中不包含有he的那一行;
-E:支持使用擴展的正則表達式元字符
-q:靜默模式,即不輸出任何信息
-A #(after):顯示匹配到的字符串行的後#行
比如:顯示/woniu/testz.txt文件中包含有He的那一行的後一行;
-B #(before):顯示匹配到的字符串行的前#行
比如:顯示/woniu/testz.txt文件中包含有He的那一行的前一行;
-C (context)#:顯示匹配到的字符串行的前後各#行
比如:顯示/woniu/testz.txt文件中包含有He的那一行的前一行和後一行;
sed:流編輯器,可以將匹配到的數據進行替換、刪除、新增、選取特定行等功能。
sed用法:ed[OPTION]... 'script' [input-file]...
常用選項:
-n:不輸出模式空間中的內容至屏幕
-e script,--expression=script:多點編輯;
-f /PATH/TO/SED_SCRIPT_FILE
-r:支持使用擴展正則表達式
-i:直接編輯原文件
地址定界:
(1)不給地址(空地址):對全文進行處理;
(2)單地址:
#:指定行
例如,打印test.txt中的第一行;
/pattern/:被此模式匹配到的每一行
例如,打印test.txt中包含his的行
(3)地址範圍
#,#
例如,打印test.txt中的第一行到第三行的內容;
#,+#
例如,打印test.txt中的第一行及第一行之後兩行的內容;
#,/pat1/
/pat1/,/pat2/
(4)步進:~
1~2:所有奇數行
2~2:所有偶數行
編輯命令:
d:刪除模式空間中的內容
例如,刪除test.txt文件中的前兩行:
p:打印模式空間中的內容
sed '1~2p'/etc/fstab此用法會顯示兩次文件中的奇數行,因爲默認情況下匹配到的模式會被輸出,而p又表示輸出,所以會顯示兩次,如果想顯示一次,使用-n;
a \text:在行後面插入文本"text",支持使用\n(\n表換行)多行插入;
例如,在第一行後面插入zyc:
i \text:在行前面插入文本"text",支持使用\n(\n表換行)多行插入;
例如,在第一行前面插入兩行zyc:
c \text:把匹配到的行替換爲此處指定的文本“text”;
例如,將第一行替換爲zyc
w /PATH/TO/SOMEFILE :保存模式空間匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行後面;文件合併;
=:爲模式匹配到的行打印行號;
例如,顯示test.txt中包含his行的行號:
!:條件取反;放在模式後面的命令之前
例如,顯示test.txt文件中,不包含his的行:
s///:查找替換,其分隔符可自行指定,常用的有s@@@,s###等;
替換標記:
g:全局替換;
w/PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
p:顯示替換成功的行;
例如,將test.txt文件中his替換爲he:
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
g:把保持空間中的內容覆蓋至模式空間中;
G:把保持空間中的內容追加至模式空間中;
x:把模式空間中的內容與保持空間中的內容互換;
n:覆蓋讀取匹配到的行的下一行至模式空間中;原行會被覆蓋
N:追加讀取匹配到的行的下一行至模式空間中
d:刪除模式空間中的行;
D:刪除多行模式空間中的所有行;
示例:
sed -n 'n;p' FILE:顯示偶數行;
sed '1!G;h;$!d' FILE:逆序顯示文件的內容;
sed '$!d' FILE:取出最後一行
sed'$!N;$!D' FILE:取出文件後兩行
sed '/^$/d;G' FILE:刪除原有的所有空白行,而後爲所有的非空白行後添加一個空白行;
sed 'n;d' FILE:顯示奇數行;
sed 'G' FILE:在原有的行後面添加一行空白行;