linux中awk是一個強大的文本分析工具,awk在其對數據分析並生成報告時,顯得尤爲強大。簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各種分析處理
- awk空格等於把兩個字段拼接起來
- " "表示中間是字符
- OFS默認是一個空格,將文本文件拼接到一起。當給某一列賦值時,會使OFS重新拼接文件
查看文件
awk '{print}' coin.txt
查看第一列
awk '{print $1}' coin.txt
查看文件前三列
awk '{print $1,$2,$3}' coin.txt
添加製表符 "\t" 使每列直接用tab隔開
awk '{print $1 "\t" $2 "\t" $3}' coin.txt
- NR代表文件每行的行數
- NF代表文件中每行有多少個字段個數
- "NR"=number of record
- "NF"=number of field
打印出文件中每列有多少個字段
awk '{print NF}' coin.txt
打印出文件中有多少行
awk '{print NR}' coin.txt
打印前兩列,並顯示每列的行數
awk '{print NR "\t" $1 "\t" $2}' coin.txt
顯示出文件所有內容,並打印出每行的行數
awk '{print NR, $0}' coin.txt # $0表示輸出coin.txt的所有內容,NR", " 表示行數與第一列以一個空格分隔
打印出文件內容並且輸出每一行的字段個數
awk '{print NF "\t" $0}' coin.txt
第三列是1986就打印出來
awk '$3==1986 {print $0}' coin.txt
打印出第一列等於gold的信息
awk '$1=="gold" {print $0}' coin.txt #字符串要使用雙引號
打印出第7行
awk 'NR==7{print NR, $0}' coin.txt
打印出字段數爲7的
awk 'NF==7{print NR, $0}' coin.txt
如果awl命令後邊沒有文件名的話,awk會等待你輸入,然後再執行命令輸出信息
Ctrl+C 退出
用FS自定義自己的分隔符,只會以逗號進行分割,就算字符中間有空格的話,依舊會以逗號分隔打印出來
用OFS定義輸出分隔符
也看以同時把輸入輸出分隔符定義成一個符號,中間用分號隔開
可以同時打印兩個文件
awk '{print NR,$0}' coin.txt 1.txt
加FILENAME 打印出文件名
awk '{print NR,FILENAME,$0}' coin.txt 1.txt
可以選擇文件內容進行賦值,比如把第三列輸出成空格
awk '{$3=" ";print $0}' coin.txt
用NF打印出每列最後一個字段
awk '{print $NF}' coin.txt #NF代表每列有多少個字段,所以直接打印NF就可以
打印每列倒數第二個同理
awk '{print $(NF-1)}' coin.txt
正則表達式
/ /
編輯一個test文件,打印出”abc“
awk '/abc/{print $0}' test.txt
/a.b/ 點在這裏表示a和b之間任意一個字符
awk '/a.c/{print $0}'
/a.c/ " \ "是轉譯字符,只打印出a.c, 匹配其他特殊字符時同理
^和$ ^表示所匹配字符串要在字段最前面,$表示所匹配字符串在字段最後
awk '/^777/{print $0}'
awk '/777$/{print $0}
/a[xzy]b/ 表示可以匹配a和b中間[]裏的xzy中任意一個字符
awk '/a[xzy]c/{print $0}'
/a[a-z]b/同理,匹配[]中a和z直接任意一個字符
awk '/a[a-z]c/{print $0}'
awk '/a[a-zA-Z]c/{print $0}' #a到z A到Z中間任意一個字符
^如果在[]裏表示不是的意思
[^]
awk '/a[^a-z]c/ {print $0}' #小寫a到z不匹配
* 和 + ?
-
*表示0次或多次
比如:
/a*b/
可以匹配到
"ab"
"aab"
"aaab"
"b" -
+表示最少1次
比如:
/a+b/
可以匹配到
"ab"
"aab"
不能匹配到
"b" - ?表示是或否
比如:
/a?b/
只能匹配到
"b"
"ab"
{} 可以規定匹配到的次數
awk '/ab{2}c/ {print $0}' #{2}表示只可以出現2個b
也可以擴展{2,3}
awk '/ab{2,3}c/ {print $0}' #表示b可以出現2次到3次
/ab{2,}c/ 表示最少出現2個b。
()表示把()裏的變成一個整體
比如/(ab)+c/
awk '/(ab)+c/ {print $0}'