先說說sed,sed即stream editor。是一種非交互式上下文編輯器,它對源文件沒有破壞性,查詢中不改動源文件(但可以實現此功能),sed通過限制條件對文本進行行讀取,並將讀取內容貯存在內存中,根據限制內容pattern將文本由選擇性的輸出。sed不僅僅能夠根據pattern(樣式)作為約束條件,它還支持腳本導入的約束條件,這樣節省了可觀的鍵入和隨之而來的錯誤。
下面我們來看看sed的簡單用法:
sed [option] /pattern/command file…
sed [option] adr1,adr2/command file…
sed [option] script file..
command:命令不支持像選項那樣可以組合使用,所以每條命令在每個語句中只能出現一次。
p:顯示出所有信息,在設定顯示條件的情況下匹配內容會多顯示一次。
d:刪除匹配內容所在的行。
a\:在指定行後添加一行或多行。
i\:在指定行前添加一行或多行。(\後為添加內容)
s:查找替換 (s/查找要替換的內容/新替換的字符串/ i不區分大小學 g 全局替換查找)
pattern支持正則表達式,與grep中的使用格式相同。
注意:在使用正則表達式時,一旦用到元字符,則該這個正則表達式必須加引號。
option:
-n 取消默認顯示輸出 使顯示匹配內容
-e 在一個sed語句中加入多個限制條件,每個均以-e開頭
-f 在-f選項後可直接跟一個腳本,sed就以此腳本導入限制條件
-i 在sed中加入該選項,將把原來對內存的
eg:
sed /關鍵字/ 文件目錄
[[email protected] tmp]# sed -n /id/p /etc/inittab #若要其顯示內容p命令必不可少,只顯示匹配則需要-n選項
sed 地址1,地址2 文件目錄 #地址信息包括:行號、字符串和正則表達式。
[[email protected] tmp]# sed -n 2,5p /etc/inittab #顯示2~5行的所有內容
[[email protected] tmp]# sed -n /bug/,/bug/p /proc/cpuinfo #從帶有bug字符串的第一行顯示到最後一行
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
[[email protected] tmp]# sed -n '/^cache/p' /proc/cpuinfo #以cache開頭的行(正則表達式用到元字符必須加引號!)
[[email protected] tmp]# sed '/^processor/ a\#this is my cpu!' /proc/cpuinfo # a\命令故不能在出現p命令了,i\的命令與之相同。
processor : 0
#this is my cpu!
vendor_id : GenuineIntel
….
[[email protected] tmp]# sed '1,$s/yes/YES!/g' /proc/cpuinfo
# 查找范圍1,$表示1到最後一行,s/ 匹配並替換的內容 / 新替換字段 / g表示匹配行內全局替換。
[[email protected] tmp]# sed '/^[[:space:]]*#/d' /etc/inittab
#刪除顯示內容中以 0個或多個空白字符緊接#開頭的行
下面說說awk,awk不僅是linux也是任何環境中現有功能最強大的數據處理引擎之一,它不僅支持簡單的查找命令而且支持創建簡短的程序,這些程序可以實現數據排序、處理數據、輸入計算以及生成報表。與其說他是一款數據處理程序倒不如說他是一種用於文件的編程語言工具。
awk的格式:awk的命令有模式pattern和操作action組成,模式pattern由兩斜槓之間的正則表達式和一個或多個awk操作符組成;操作action由括在大括號內的一條或多條語句組成,語句之間用分號隔開。注意pattern中的正則表達式兩端必須加/ /,action的兩端必須加{ }。具體格式如下:
[[email protected] ~]# awk 'pattern{action}' filename
awk的格式化輸出:
print命令
awk默認將整個文本以換行符分成若干個record,將每record以空格分成了若干個field。
每個field分別對應$1$2$3…$n,整個record即1..n的總和為$0。
並且用一下幾個內置變量來定義:
FS:輸入字段分隔符,默認為空格
RS:輸入行分隔符,默認為換行符
OFS:輸出字段分隔符,默認問空格
ORS:輸出行分隔符,默認為換行符
NF:當前記錄中的字段數
NR:當前的行數
BEGIN模式
BEGIN+操作塊,awk必須在輸入文件在進行任何處理之前執行BEGIN後的模塊.
eg:
[[email protected] ~]# awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}' /etc/passwd
#分析:輸入文件在未執行任何操作之前,將FS和OFS分別替換,然後輸出被新分隔符分割的字段 1 和 2 。
END模式
END+操作塊,此模式不匹配任何輸入行,而是執行任何與之關聯的操作。即awk在處理完成輸出前執行END+操作塊。
eg:
[[email protected] ~]# awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}END{print "show complet!"}' /etc/passwd
#在輸出結果後加入字符串show complet!
[[email protected] ~]# awk 'BEGIN{FS=":";OFS="-"}{print NR":"$1,$2}END{print "show complet!"}' /etc/passwd
1:root-x
2:bin-x
3:daemon-x
4:adm-x
5:lp-x
6:sync-x
7:shutdown-x
…
#此為print中加入NR的效果,顯示了行號;並且還顯示了額外字符串”: ”,print命令和C語言中的相同 輸出變量時不需要家任何修飾符,輸出文本內容則要加上” ”雙引號。