awk:報告生成器(不修改文本,只是提取信息)
一些重要參數
- 行 record
- 列 field
- NR number of record
- NF number of field 每行有幾列
awk '{print $1}' file # 打印文件裏一列,以空格爲分割的
awk '{print $NF}' file # 打印文件裏最後列
awk '{print $(NF-1)}' file # 打印文件裏倒數第二列,不加括號就是NF的值減一
列對齊 “\t”
awk '{print $1, "\t", $2, "\t", $3}' file
awk默認把空格當作字符拼接符,逗號則是默認分隔符
awk '{print $1, $2, $3}' file # 逗號把每一列隔開(一個空格)
awk '{print $1 $2 $3}' file # 空格把每一列拼接在一起
echo 1:2 3*4 | awk -F: '{print $1}' # 用-F指定那個是分隔符
echo 1:2 3*4 | awk -F" " '{print $(NF-1)}' # 用-F指定那個是分隔符(雙引號中的是分隔符)
顯示行數
awk '{print NR "\t" $0}' awk.file # $0表示所有的列
顯示列數
awk '{print N "\t" $0}' awk.file # $0表示所有的列
顯示2012年入職的員工(有條件的提取信息)
awk '$2=="2012"{print $0}' staff.txt # ==兩個等於號表示匹配
只打印每行的列數
awk '{print NF}' staff.txt
只打印行號
awk '{print N}' staff.txt
只打印第三行
awk 'NR=="3"{print NR, $0}' staff.txt
只打印第五列
awk 'NF=="5"{print $0}' staff.txt
如果不輸入文件名,系統會等待輸入!只能Ctrl+C取消
自定義分隔符
awk 'BEGIN{FS=","}{print $1}'
BEGIN表示全局變量,FS表示當前分隔符
awk默認的輸入分隔符和輸出分隔符是分別定義的, 默認的時候都是空格。
awk 'BEGIN{FS=",";OFS=","}{print $1, $2}'
兩個文件同時打印行號和某列,則會合並顯示(文件2內容追加在文件1下面)
awk '{print NR, $1}' satff.txt awk.txt
輸出的時候同時輸出文件名
awk '{print NR, FILENAME, $0}' satff.txt awk.txt
awk '{print NR, "\t", FILENAME, "\t", $0}' satff.txt awk.txt
隱藏某一列的內容
awk '{$3="XXXX"; print $0}' staff.txt
由於awk不會修改文件內容,可用>
覆蓋或>>
追加到某文件
awk '{$3="XXXX"; print $0}' staff.txt > result
more result
把result的內容用awk來處理並顯示
awk '{$3="XXXX"; print $0}' staff.txt < result
輸入內容並用awk來處理和顯示,END是輸入的結束符
awk '{$3="XXXX"; print $0}' staff.txt << END
awk做計算
awk '{a=1; b=3; print a+b}'
此時會等待輸入,由於我們已經輸入好了,所以直接回車,awk會給出顯示結果
awk計算時遇到字符,從左到右遇到數字進行匹配,遇到字符就停止,若第一個爲字符,則直接忽略掉
awk '{a=1d888sa; b=333dsgh654; print a+b}' # 結果是334