awk 是以文件的一行內容為處理單位的一個文本處理工具,依次對每一行進行處理,然后輸出 awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,默認以空格為分隔符將每行切片,切開的部分再進行各種分析處理。
awk是行處理器,相比較屏幕處理的優點,在處理龐大文件時不會出現內存溢出或是處理緩慢的問題,通常用來格式化文本信息 ———————————————— 版權聲明:本文為CSDN博主「謝公子」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/qq_36119192/java/article/details/82982732
awk如何使用?
awk讀取一行內容,然后根據指定條件判斷是否處理此行內容,若此行文本符合條件,則按照動作處理文本,否則跳過此行文本,讀取下一行進行判斷。
awk參數?
參數: -F 指定分隔符 每一行的分割符號 分割后$1發生變化 -f 調用腳本 -v 定義變量 Begin{} 初始化代碼塊,在對每一行進行處理之前,初始化代碼,主要是引用全局變量,設置FS分隔符 // 匹配代碼塊,可以是字符串或正則表達式 {} 命令代碼塊,包含一條或多條命令,多條命令用 ; 隔開 awk 參數 ' BEGIN{} // {action1;action2} ' END{} 文件名 END{} 結尾代碼塊,在對每一行進行處理之后再執行的代碼塊,主要是進行最終計算或輸出結尾摘要信息 例:awk 'BEGIN{X=0}/root/{X+=1}END{print "I find",X,"root lines"}' /etc/passwd 統計 /etc/passwd 文件中包含root行的總數
awk中字符的含義
$0 表示整個當前行 $1 每行第一個字段 NF 字段數量變量 NR 每行的記錄號,多文件記錄遞增 FNR 與NR類似,不過多文件記錄不遞增,每個文件都從1開始 \t 制表符 \n 換行符 FS BEGIN時定義分隔符 RS 輸入的記錄分隔符, 默認為換行符(即文本是按一行一行輸入) ~ 包含 !~ 不包含 == 等於,必須全部相等,精確比較 != 不等於,精確比較 && 邏輯與 || 邏輯或 匹配時表示1個或1個以上 /[0-9][0-9]+/ 兩個或兩個以上數字 /[0-9][0-9]*/ 一個或一個以上數字 OFS 輸出字段分隔符, 默認也是空格,可以改為其他的 ORS 輸出的記錄分隔符,默認為換行符,即處理結果也是一行一行輸出到屏幕 -F [:#/] 定義了三個分隔符
print 打印
print 是 awk打印指定內容的主要命令,也可以用 printf awk '{print}' /etc/passwd == awk '{print $0}' /etc/passwd awk '{print " "}' /etc/passwd 不輸出passwd的內容,而是輸出相同個數的空行,進一步解釋了awk是一行一行處理文本 awk '{print "a"}' /etc/passwd 輸出相同個數的a行,一行只有一個a字母 awk -F: '{print $1}' /etc/passwd == awk -F ":" '{print $1}' /etc/passwd awk -F: '{print $1 $2}' 輸入字段1,2,中間不分隔 awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd 輸出字段1,3,6, 以制表符作為分隔符 awk -F: '{print $1; print $2}' /etc/passwd 輸入字段1,2,分行輸出 awk -F: '{print $1 "**" print $2}' /etc/passwd 輸入字段1,2,中間以**分隔 awk -F: '{print "name:"$1"\tid:"$3}' /etc/passwd 自定義格式輸出字段1,2 awk -F: '{print NF}' /etc/passwd 顯示每行有多少字段 awk -F: 'NF>2{print }' /etc/passwd 將每行字段數大於2的打印出來 awk -F: 'NR==5{print}' /etc/passwd 打印出/etc/passwd文件中的第5行 awk -F: 'NR==5|NR==6{print}' /etc/passwd 打印出/etc/passwd文件中的第5行和第6行 awk -F: 'NR!=1{print}' /etc/passwd 不顯示第一行 awk -F: '{print > "1.txt"}' /etc/passwd 輸出到文件中 awk -F: '{print}' /etc/passwd > 2.txt 使用重定向輸出到文件中
字符匹配
awk -F: '/root/{print }' /etc/passwd 打印出文件中含有root的行 awk -F: '/'$A'/{print }' /etc/passwd 打印出文件中含有變量 $A的行 awk -F: '!/root/{print}' /etc/passwd 打印出文件中不含有root的行 awk -F: '/root|tom/{print}' /etc/passwd 打印出文件中含有root或者tom的行 awk -F: '/mail/,mysql/{print}' test 打印出文件中含有 mail*mysql 的行,*代表有0個或任意多個字符 awk -F: '/^[2][7][7]*/{print}' test 打印出文件中以27開頭的行,如27,277,27gff 等等 awk -F: '$1~/root/{print}' /etc/passwd 打印出文件中第一個字段是root的行 awk -F: '($1=="root"){print}' /etc/passwd 打印出文件中第一個字段是root的行,與上面的等效 awk -F: '$1!~/root/{print}' /etc/passwd 打印出文件中第一個字段不是root的行 awk -F: '($1!="root"){print}' /etc/passwd 打印出文件中第一個字段不是root的行,與上面的等效 awk -F: '$1~/root|ftp/{print}' /etc/passwd 打印出文件中第一個字段是root或ftp的行 awk -F: '($1=="root"||$1=="ftp"){print}' /etc/passwd 打印出文件中第一個字段是root或ftp的行,與上面的等效 awk -F: '$1!~/root|ftp/{print}' /etc/passwd 打印出文件中第一個字段不是root或不是ftp的行 awk -F: '($1!="root"||$1!="ftp"){print}' /etc/passwd 打印出文件中第一個字段不是root或不是ftp的行,與上面等效 awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd 如果第一個字段是mail,則打印第一個字段,否則打印第2個字段
格式化輸出
*awk '{printf "%-5s %.2d",$1,$2}' test\**** - printf 表示格式輸出 - %格式化輸出分隔符 - -8表示長度為8個字符 - s表示字符串類型,d表示小數
示例
1、顯示 /etc/passwd 中含有 root 的行 awk '/root/' /etc/passwd 2、以 : 為分隔,顯示/etc/passwd中每行的第1和第7個字段 awk -F ":" '{print $1,$7}' /etc/passwd 或 awk 'BEGIN{FS=":"}{print $1,$7}' /etc/passwd 3、以 : 為分隔,顯示/etc/passwd中含有 root 的行的第1和第7個字段 awk -F ":" '/root/{print $1,$7}' /etc/passwd 4、以 : 為分隔,顯示/etc/passwd中以 root 開頭行的第1和第7個字段 awk -F ":" '/^root/{print $1,$7}' /etc/passwd 5、以 : 為分隔,顯示/etc/passwd中第3個字段大於999的行的第1和第7個字段 awk -F ":" '$3>999{print $1,$7}' /etc/passwd 6、以 : 為分隔,顯示/etc/passwd中第7個字段包含bash的行的第1和第7個字段 awk -F ":" '$7~"bash"{print $1,$7}' /etc/passwd 7、以 : 為分隔,顯示/etc/passwd中第7個字段不包含bash的行的第1和第7個字段 awk -F ":" '$7!~"nologin"{print $1,$7}' /etc/passwd 8、以 : 為分隔,顯示$3>999並且第7個字段包含bash的行的第1和第7個字段 awk -F ":" '$3>999&&$7~"bash"{print $1,$7}' /etc/passwd 9、以 : 為分隔,顯示$3>999或第7個字段包含bash的行的第1和第7個字段 awk -F ":" '$3>999||$7~"bash"{print $1,$7}' /etc/passwd 10、以 : 為分隔,第10行輸出1,其他輸出當前行 awk -F ":" ' {if (NR ==10){print 1} else {print}}' /etc/passwd