awk 簡介
awk是一個文本處理工具,通常用於處理數據並生成結果報告,
awk的命名是它的創始人 Alfred Aho、Peter Weinberger和Brian Kernighan 姓氏的首個字母組成的。
awk的工作模式
語法格式
第一種形式: 基於文件
awk 'BEGIN{}pattern{commands}END{}' file_name
第二種形式: 基於標准命令格式
standard output | awk 'BEGIN{}pattern{commands}END{}'
語法格式說明
awk的內置變量
內置變量對照表
內置變量: $0 打印行所有信息 $1~$n 打印行的第1到n個字段信息 NF Number Field 處理行的字段個數 NR Number Row 處理行的行號 FNR File Number Row 多文件處理時,每個文件單獨記錄行號 FS Field Separator 字段分隔符,不指定時默認以空格或tab鍵分割 RS Row Separator 行分隔符,不指定時以回車換行分割 OFS Output Filed Separator 輸出字段分隔符 ORS Output Row Separator 輸出行分隔符 FILENAME 處理文件的文件名 ARGC 命令行參數個數 ARGV 命令行參數數組
輸出整行數據
awk '{print $0}' passwd
FS指定分隔符為 : 輸出所有行第一個字段
awk 'BEGIN{FS=":"}{print $1}' passwd
默認以空格或者tab為分隔符
list
Hadoop Spark Flume Java Python Scala Allen Mike Meggie
以空格為分隔符, 輸出第一個字段
awk 'BEGIN{FS=" "}{print $1}' list
NF 輸出每一行的字段個數
awk '{print NF}' list
NR 輸出行號,處理多個文件(list,passwd,/etc/fstab) 時行號累加
awk '{print NR}' list passwd /etc/fstab
FNR在處理兩個文件以上時會單獨計數
awk '{print FNR}' list /etc/fstab
list
Hadoop|Spark:Flume Java|Python:Scala:Golang Allen|Mike:Meggie
以 | 符號分隔列, 輸出第二個字段
以 : 符號分隔列
awk 'BEGIN{FS=":"}{print $2}' list
list
Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie
RS 指定行分隔符: --
awk 'BEGIN{RS="--"}{print $0}' list
awk 'BEGIN{RS="--";FS="|"}{print $3}' list
ORS輸出分隔符,以&連接各輸出行
awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $3}' list
字段默認分隔符是空格
awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $1,$3}' list
OFS 指定字段分隔符為 :
awk 'BEGIN{RS="--";FS="|";ORS="&";OFS=":"}{print $1,$3}' list
FILENAME 文件名
awk '{print FILENAME}' list
list
Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie Test File Line
輸出3次文件名list,是因為沒有輸入匹配模式 awk默認是行處理,文本有3行,處理三次會有3次輸出
awk '{print FILENAME}' list
ARGC命令行參數個數 awk 和 list 共鏈各個參數
awk '{print ARGC}' list
awk '{print ARGC}' list /etc/fstab 這樣的話就是 3 個參數
NF表示字段個數,NF=7 $NF表示字段的個數一般來顯示最后一個字段
awk 'BEGIN{FS=":"}{print $NF}' passwd
awk 格式化輸出 printf
printf的格式說明符
格式化案例演示
printf默認沒有分隔符
awk 'BEGIN{FS=":"}{printf $1}' passwd
加入換行,格式化輸出
awk 'BEGIN{FS=":"}{printf "%s\n",$1}' passwd
使用占位符美化輸出,默認是右對齊
awk 'BEGIN{FS=":"}{printf "%20s %20s\n",$1,$7}' /etc/passwd
- 減號是左對齊,+ 加號是右對齊
awk 'BEGIN{FS=":"}{printf "%-20s %-20s\n",$1,$7}' /etc/passwd
以字符串格式打印/etc/passwd中的第7個字段,以":"作為分隔符
awk 'BEGIN{FS=":"}{printf "%s\n",$7}' passwd
以10進制格式打印/etc/passwd中的第3個字段,以":"作為分隔符
awk 'BEGIN{FS=":"}{printf "%d\n",$3}' passwd
以浮點數格式打印/etc/passwd中的第3個字段,以":"作為分隔符
awk 'BEGIN{FS=":"}{printf "%0.2f\n",$3}' passwd
以16進制數格式打印/etc/passwd中的第3個字段,以":"作為分隔符
awk 'BEGIN{FS=":"}{printf "%x\n",$3}' passwd
以8進制數格式打印/etc/passwd中的第3個字段,以":"作為分隔符
awk 'BEGIN{FS=":"}{printf "%o\n",$3}' passwd
以科學計數法格式打印/etc/passwd中的第3個字段,以":"作為分隔符
awk 'BEGIN{FS=":"}{printf "%e\n",$3}' passwd
awk模式匹配的兩種方法
awk 模式匹配格式對照表
正則匹配 RegExp
匹配/etc/passwd文件行中含有root字符串的所有行
awk 'BEGIN{FS=":"}/root/{print $0}' passwd
匹配/etc/passwd文件行中以nginx開頭的所有行
awk '/^nginx/{print $0}' passwd
運算符匹配
- < 小於
- > 大於
- <= 小於等於
- >= 大於等於
- == 等於
- != 不等於
- ~ 匹配正則表達式
- !~ 不匹配正則表達式
以 : 為分隔符,匹配/etc/passwd文件中第3個字段小於50的所有行信息
awk 'BEGIN{FS=":"}$3<50{print $0}' passwd
以:為分隔符,匹配/etc/passwd文件中第3個字段大於50的所有行信息
awk 'BEGIN{FS=":"}$3>50{print $0}' passwd
以:為分隔符,匹配/etc/passwd文件中第7個字段為/bin/bash的所有行信息
awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' passwd
以:為分隔符,匹配/etc/passwd文件中第7個字段不為/bin/bash的所有行信息
awk 'BEGIN{FS=":"}$7!="/bin/bash"{print $0}' passwd
以:為分隔符,匹配/etc/passwd文件中第3個字段包含3個數字以上的所有行信息
awk 'BEGIN{FS=":"}$3 ~ /[0-9]{3,}/{print $0}' passwd
布爾運算符匹配
- || 或
- && 與
- ! 非
以 : 為分隔符,匹配/etc/passwd文件中包含ftp或mail的所有行信息
awk 'BEGIN{FS=":"}$1=="ftp" || $1=="mail"{print $0}' passwd
以:為分隔符,匹配/etc/passwd文件中第3個字段小於50並且第4個字段大於50的所有行信息
awk 'BEGIN{FS=":"}$3<50 && $4>50{print $0}' passwd
匹配包含 nginx 的行
awk 'BEGIN{FS=":"}/^nginx/{print $0}' passwd
關系運算符,uid 等於1的行
awk 'BEGIN{FS=":"}$3==1{print $0}' passwd
匹配uid(數字)為3位及以上的行
awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' passwd
匹配不包含/sbin/nologin 的行
awk 'BEGIN{FS=":"}$0!~/\/sbin\/nologin/{print $0}' passwd
找出 uid 小於50,且bash為 /bin/bash 的行
awk 'BEGIN{FS=":"}$3<50 && $7~/\/bin\/bash/ {print $0}' passwd