0x01 What
一次讀取一行文本,按輸入分隔符進行切片,切成多個組成部分,將每片直接保存在內建的變量中,$1,$2,$3....,引用指定的變量,可以顯示指定段,或者多個段。如果需要顯示全部的,需要使用$0來引用??梢詫蝹€片段進行判斷,也可以對所有段進行循環(huán)判斷。
其默認分隔符為空格
0x02 How
1、命令格式
awk [options] 'program' FILE......
[options]說明
-
-F: 指明輸入時用到的字段分隔符 -
-vvar=VALUE : 自定義變量
在awk中變量的引用不需要加$,而是直接引用
2、使用方法
主要有兩種模式
1、awk [options] 'scripts' file1,file2.....
在這種模式中,scripts主要是命令的堆砌,命令之間用分號分割;對輸入的文本行進行處理,通過命令print,printf或是輸出重定向的方式顯示出來,這里經常用到的知識點是:awk的內置變量,以及命令print和printf的使用
2、awk [options] 'PATTERN{action}' file,file2.....
在這種模式中,最重要的是5種模式和5種action的使用,以及awk的數(shù)組的使用和內置函數(shù)
3 第一種使用模式
1、print
- 各項目之間使用逗號隔開,而輸出時則以空白字符分隔
- 輸出的Item可以為字符串或數(shù)值,當前記錄的字段(如$1)、變量或awk的表達式,數(shù)值會先轉換為字符串,而后再輸出
- print命令后面的Item可以省略,此時其功能相當于print $0,因此,如果想輸出空白行,則需要使用print""
- 如果引用變量$1或其他的,是不能使用引號引起來
2、內置變量
-
FS: input field seperator,輸入的分隔符,默認為空白字符 -
OFS: output field seperator,輸出的分隔符,默認為空白字符 -
RS: input record seperator,輸入的換行符 -
ORS: output record seperator,輸出時的換行符 -
NF: number of field ,字段個數(shù)
awk '{print NF}' /etc/fstab :打印每行的最后一個字段為第幾個字段,這里是數(shù)量引用,不是對應的值引用
awk '{print $NF}' /etc/fstab : 打印每行中的最后一個字段
-
NR: number of record,文件中的行數(shù)
awk '{print NR}' /etc/fstab: 打印行號,其會個行號都顯示
awk 'END{print NR}' /etc/fstab: 顯示文本的總行數(shù),其只是在文本處理完成后,只顯示一次行號
awk '{print NR}' file1 file2 : 會每把所有文檔進行總的編號,而不是單獨對文件進行編號
-
FNR: 對每個文件進行行數(shù)單獨編號
awk '{print FNR}' file1 file2 : 會對每個文件的行數(shù)進行單獨的編號顯示
-
FILENAME: awk命令所處理的文件的名稱
awk '{print FILENAME}' file1 : 顯示當前文件名,但會每行顯示一次
awk 'END{print FILENAME}' file1 : 顯示當前文件名,但只會顯示一次
-
ARGC: 命令行中參數(shù)的個數(shù),其awk命令也算一個參數(shù)
awk 'END{print ARGC}' /etc/fstab : 顯示共有幾個參數(shù)
-
ARGV: 其是一個數(shù)組,保存的是命令行所給定的各參數(shù)
awk 'END{print ARGV[0]}' /etc/fstab : 顯示第一個參數(shù),默認第一個參數(shù)個awk命令本身
3、自定義變量
-
-v var=VALUE: 在options定義 -
awk 'BEGIN{test="hello";print test}': 在program中定義
4、printf命令
其格式化輸出:printf FORMAT,item1,item2....
例子:awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt
格式符
-
%c:顯示字符的ASCII碼 -
%d,%i :顯示十進制整數(shù) -
%e,%E:科學計數(shù)法數(shù)值顯示 -
%f :顯示為浮點數(shù) -
%g,%G:以科學數(shù)法或浮點形式顯示數(shù)值 -
%s:顯示字符串 -
%u:無符號整數(shù) -
%%:顯示%號自身,相當于轉義
修飾符
-
N :顯示寬度 -
- :左對齊(默認為右對齊) -
+ :顯示數(shù)值符號
輸出重定向
4第二種使用模式
awk [option] 'PATTERN{action}' file1,file2....
1、PATTERN的使用
- (1)
REGEXP:正則表達式,格式為/regular expression/,僅處理能夠被此處模式匹配到的行
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab
- (2)
relational expression:表達式,其值非0或為非空字符時滿足條件,用運算符
~(匹配)和!~(不匹配)
awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
- (3)
Ranges : 指定匹配范圍,格式為/pat1/,/pat2/
awk -F: '{NR>=2&&<=10){print $1}' /etc/passwd
awk -F:' /^ root/,/^myuser/{print $1}' /etc/passwd
- (4)
BEGIN/END模式 : 特殊模式,僅在awk命令執(zhí)行前運行一次或結束前運行一次
awk -F: 'BEGIN{print "Username ID Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd :先打印一個表頭
awk -F: 'BEGIN{print "username ID Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}END{print "end of report."} /etc/passwd :打印一個表尾
- (5)
Empty(空模式):匹配任意輸入行