命令主要用法 -格式1:前置命令 | awk [選項] '[條件]{編輯指令}' -格式2:awk [選項] '[條件]{編輯指令}' filename 常用命令選項 -F:指定分隔符,可省略(預設空格或者Tab位) -f:調用awk腳本盡心個處理 -V:調用外部shell變數 內置變數 變數 用途 ...
命令主要用法
-格式1:前置命令 | awk [選項] '[條件]{編輯指令}'
-格式2:awk [選項] '[條件]{編輯指令}' filename
常用命令選項
-F:指定分隔符,可省略(預設空格或者Tab位)
-f:調用awk腳本盡心個處理
-V:調用外部shell變數
內置變數
變數 用途
FS 保存或設置欄位分隔符,如FS=":"
$n 指定分隔的第n個欄位,例如$1,$4分別表示第1例,第4例
$0 當前讀入的整行文本內容
NF 記錄當前處理行的欄位個數(有多少列)
FNR 記錄當前處理行在原文本內的行號
NR 記錄當前已經讀入行的數量(多個文本一起讀取時,行數累加)
FILENAME 當前處理的文件名
ENVIRON 調用shell環境變數,格式:ENVIRON["變數名"]
awk過濾的時機
BEGIN{}
讀入第一行文本之前執行
一般用來初始化操作
逐行處理{}
逐行讀入文本執行相應的處理
是最常見,用的多少的編輯指令塊
END{}
處理完最後一行文本後執行
一般用來出數處理結果
[root@localhost ~]# awk '{print "第" FNR"行" ,"有"NF"列"}' a.txt 第1行 有2列 第2行 有4列 第3行 有2列 第4行 有3列
1)輸出當前用戶的UID
[root@localhost ~]# awk -F: '$1==ENVIRON["USER"]{print $3}' /etc/passwd 0
2)預處理
[root@localhost ~]# awk 'BEGIN{a=10;print a+10}' 20
3)統計使用bash的用戶數量
[root@localhost ~]# awk 'BEGIN{x=0}/\<bash$/{x++}END{print x}' /etc/passwd 1
awk處理條件概述
格式
awk [選項] '[條件]{指令}' filename
條件的表現形式
正則表達式
/正則內容/
~匹配,!~不匹配
數值/字元串比較
==,!=,>=,<=,>,<等
邏輯比較
&&邏輯與:期望多條件都成立
||邏輯或:只要有一個條件成立即滿足要求
運算符
-,+,*,/,%,++,--,+=,-=,*=,/=
1)正則內容
[root@localhost ~]# awk -F: '/^root/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash
2)~匹配,!~不匹配
[root@localhost ~]# awk -F: '$7!~/nologin/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt
3)==,!=,>=,<=,>,<等,輸出第二行文本
[root@localhost ~]# awk 'NR==2{print}' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin
4)&&邏輯與:期望多條件都成立
[root@localhost ~]# awk -F: '$3>=0&&$3<=10{print $1,$3}' /etc/passwd root 0 bin 1 daemon 2 adm 3 lp 4 sync 5 shutdown 6 halt 7 mail 8 uucp 10
5)運算符,統計文本總欄位數量
[root@localhost ~]# awk -F: 'BEGIN{i=0}{i+=NF}END{print i}' /etc/passwd 140
awk流程式控制制
單分支
if(條件){指令}
雙分支
if(條件){指令}else{指令}
多分支
if(條件){指令}else if{指令}else{指令}
while迴圈
while(條件){指令}
do while
do{指令}while(條件)
for迴圈
for(初始值;條件;步長){指令}
1)統計UID小於或等於500的用戶個數
[root@localhost ~]# awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd 21 1
2)統計root出現次數
[root@localhost ~]# awk -F[:/] '{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}' /etc/passwd 4
3)for迴圈
[root@localhost ~]# awk 'BEGIN{for(i=0;i<=10;i++){print i}}' 0 1 2 3 4 5 6 7 8 9 10
數組
定義數組
格式:數組名[下標]=元素值
調用數組
格式:數組名[下標]
遍曆數組
用法:for(變數 in 數組名){print 數組名[變數]}
數組的經典使用
去除文本重覆行:awk '!a[$2]++{print $2}' filename
逐行分析,遇到重覆行就跳過
1)去重
[root@localhost ~]# cat a.txt 111 111 222222 22 2222 2 333333333 33 444444444444 444 44 444444444444 444 44 [root@localhost ~]# awk '!a[$2]++{print $2}' a.txt 111 22 33 444
2)列出用戶登陸shell的種類
[root@localhost ~]# awk -F: '!shell[$7]++{print $7}' /etc/passwd /bin/bash /sbin/nologin /bin/sync /sbin/shutdown /sbin/halt
3)列出用戶登陸shell的種類及個數,類似的可以統計web訪問ip及訪問次數
[root@localhost ~]# awk -F: '{shell[$7]++}END{for(i in shell){print i,shell[i]}}' /etc/passwd /bin/sync 1 /bin/bash 3 /sbin/nologin 16 /sbin/halt 1 /sbin/shutdown 1 [root@localhost ~]# awk -F: '{shell[$7]++}END{for(i in shell){print i,shell[i]}}' /etc/passwd | sort -nr -k2 /sbin/nologin 16 /bin/bash 3 /sbin/shutdown 1 /sbin/halt 1 /bin/sync 1