2021-05-12 14:32:11
awk命令的基本使用方法
awk命令主要用法
-格式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
相關文章