awk
、grep
、sed
是linux
操做文本的三大利器,也是必須掌握的linux
命令之一。三者的功能都是處理文本,但側重點各不相同,其中屬awk
功能最強大,但也最複雜。grep
更適合單純的查找或匹配文本,sed
更適合編輯匹配到的文本,awk
更適合格式化文本,對文本進行較複雜格式處理。linux
如下全部實驗輸出,均以測試文件test.log
內容爲基準:正則表達式
20170102 admin,password Open 20170801 nmask,nmask close 20180902 nm4k,test filter
AWK
是一種處理文本文件的語言,是一個強大的文本分析工具; awk
是以列爲劃分計數的,$0
表示全部列,$1
表示第一列,$2
表示第二列。函數
-F
指定輸入文件折分隔符,如-F
:-v
賦值一個用戶定義變量,如-va=1
-f
從腳本文件中讀取awk
命令注:只列舉最經常使用的參數工具
每行按空格分割列,並輸出第一、3列測試
$ awk '{print $1,$3}' test.log # 或者 $ cat test.log | awk '{print $1,$3}'
使用」,」進行分割,參數用-F3d
awk -F, '{print $1,$2}' test.log
使用多個分隔符,先使用空格分割,而後對分割結果再使用」,」分割code
$ awk -F '[ ,]' '{print $1,$2,$3}' test.log #注意逗號前面有一個空格
設置awk
自定義變量,用參數-v
遞歸
例子:設置變量a爲1ip
cat test.log | awk -v a=1 '{print $1,$1+a}'
注意:-v a之間要空格。字符串
字符串拼接:(用」」而不是+)
cat test.log | awk -v a=\" '{print a""$0""a}'
輸出第一列爲20170801的記錄
cat test.log | awk '$1==20170801 {print}'
輸出第二列不是nmask,nmask的記錄
cat test.log | awk '$2!="nmask,nmask" {print}'
NR參數:輸出行號
cat test.log | awk '{print NR,$1,$2,$3}'
輸出第二列中包含nm開頭的全部記錄
cat test.log | awk '$2 ~ /nm.*/ {print}'
輸出包含2017開頭的記錄
cat test.log | awk '/2017.*/ {print}'
注意:這裏沒有~,由於沒有指定是哪一列
忽略大小寫{INGORECASE=1}
cat test.log | awk '{INGORECASE=1} /nmask/ {print}'
匹配取反 !~
cat test.log | awk '$2 !~ /nmask/ {print}'
substr字符串截取
截取第一列的第一到第四個字符
cat test.log | awk '{print substr($1,1,4)}'
split切分字符串
以逗號分隔第2列的數據,並輸出分別輸出第2列的內容
cat test.log | awk '{split($2,a,",");print a[1],a[2]}'
gsub替換
將第2列中的nmask替換成nMask
cat test.log | awk '{gsub("nmask","nMask",$2);print}'
Linux grep命令用於查找文件裏符合條件的字符串。
遞歸查詢
grep -r nmask /etc/ #查看/etc目錄下內容包含nmask的文件
查詢取反
grep -v test test.log
Linux sed命令是利用script來處理文本文件。
-e
以選項中指定的script
來處理輸入的文本文件。-f
以選項中指定的script
文件來處理輸入的文本文件。-h
顯示幫助。-n
僅顯示script
處理後的結果。-V
顯示版本信息。在test.log文件的第3行後插入一行,內容爲nmask
sed -e 3a\nmask test.log
刪除test.log的第2行、第3行數據
cat test.log | sed '2,3d'
匹配刪除,刪除行中有nmask字符串的
nl test.log | sed '/nmask/d'
sed 's/要被取代的字串/新的字串/g'