使用sed和awk進行文本處理
Shell這種腳本語言特點是,結果松散,場景復雜,針對於一些參數都有特殊意義。針對於大部分工程師而言,使用中的情況是你可能會經常忘記參數或其意義,使你不得不查閱man或網上尋求幫助。此篇文檔作用就是在自己忘記個別參數的情況下有個一目了然的答案。
一、sed進行文本處理
Linux的sed工具是linux的流編輯器,用於處理文本文件,配合正則表達式使用,功能非常強大。以下是一些sed使用示例和解釋:
# sed ‘s/oracle/CHAVIN/‘ textfile |
替換文本文件textfile中oracle為CHAVIN。腳本中的s表示替換字符的意思。 |
# sed -i ‘s/oracle/CHAVIN/‘ textfile |
-i參數意味著替換結果直接覆蓋了源文件。 |
# sed ‘s/mysql/MYSQL/g‘ textfile # sed ‘s/mysql/MYSQL/2g‘ textfile # sed ‘s/mysql/MYSQL/3g‘ textfile |
默認情況sed會將每一行中第一處符合條件的字符替換掉,g代表替換當前行中匹配的所有的字符。如果想替換第n處,可以指定ng。 |
# sed ‘s:root:CHAVIN:‘ passwd # sed ‘s|root|CHAVIN|‘ passwd |
其中:、|和/一樣都被用作界定符,效果相同。 |
# sed ‘/^$/d‘ textfile # sed ‘/mysql/d‘ textfile |
符號^$/d可以移除textfile中的空白行。 /mysql/d可以移除匹配包含字符mysql的行。 |
# sed ‘s/\b[0-9]\{3\}\b/NUMBERS/g‘ textrep |
匹配正則 \b[0-9]\{3\}\b 的選項被替換。 |
# echo this is an example | sed ‘s/\w\+/[&]/g‘ |
其中&號代表匹配的字符串內容。正則\w\+匹配單詞。 |
# echo this is eigit 7 in a number | sed ‘s/eigit \([0-9]\)/\1/‘ |
替換\([0-9]\)匹配的字符串,第一個匹配的使用\1表示,第二個使用\2表示,依次類推。 |
# echo hello world | sed "s/$name/HELLO/" |
Sed可以使用雙引號引用,使用雙引號可以使用變量($name)的形式,單引號引用的不可以。 |
二、awk進行高級文本處理
使用awk的優勢在於,它可以同時對行和列進行處理。awk腳本結構如下:
awk ‘BEGIN{ print “start” } patten { commonds } END{ print “end” }’ file
如上,awk腳本由3部分組成,BEGIN、END、帶匹配選項的語句塊可以隨意省略。
Awk自帶的一些重要功能:
l NR:記錄數量,當前行號
l NF:當前行字段總數
l $0:當前行內容
l $1:當前行第一個字段內容
l $n:當前行第n個字段內容
l $NF:當前行最後一個字段內容
以下為常用用法示例及解釋:
# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk ‘{print "Line no:"NR",No of fields:"NF",$0="$0",$1="$1",$2="$2",$3="$3,"$NF="$NF}‘ |
測試NR、NF、$0、$1、$n、$NF |
# awk ‘{ print $3,$2 }‘ textfile |
打印第2行、第3行數據 |
# seq 5 | awk ‘{sum=sum+$1}END{print sum}‘ |
計算累加 |
# seq 5 | awk ‘BEGIN{print "===================="} !/3/ { print $0 } END{print "===================="}‘ |
打印不包含3的行內容。 |
!/3/屬於awk中字段過濾部分,常用的過濾方式如下: NR<5:行號小於5的行 NR==1,NR==5:行號在1~5之間 /linux/:包含linux的行 !/linux/:比包含linux的行 |
# var=1000 # echo | awk -v VARIABLE=$var ‘{ print VARIABLE }‘ |
使用參數“-v”將外部變量傳遞給awk |
# var1=1000 # var2=2000 # echo | awk ‘{print v1,v2}‘ v1=$var1 v2=$var2 |
將變量賦值放在awk語句塊後邊聲明,可以同時傳遞多個值到awk中 |
# awk -F: ‘{ print $1,$2,$3,$4,$NF }‘ passwd |
使用參數“-F”設定字段分隔符,默認字段分隔符是空格,這裏指定為“:”。 |
# echo | awk ‘{ for(i=1;i<10;i++){ print i } }‘ |
在awk中使用for循環。 |
# echo | awk -F: ‘{ "grep root /etc/passwd" | getline output;print output }‘ |
使用輸出結果讀入變量方式為output賦值,語法為【“command” | getline output】。 |
Awk內嵌函數參考文檔:http://www.cnblogs.com/chengmo/archive/2010/10/08/1845913.html
使用sed和awk進行文本處理