linux三剑客之awk (用于个人学习以及回顾)
一 . awk工具概述
? ?? awk編程語言/數據處理引擎
創造者:Aho、Weinberger、Kernighan
基于模式匹配檢查輸入文本,逐行處理并輸出
通常用在shell腳本中,獲取指定的數據
單獨用時,可對文本數據做統計
? ?? 命令格式解析
?? 主要用法
? ? 格式1:前置命令 | awk [選項] '[條件]{指令}'
? ? 格式2:awk [選項] '[條件]{指令}'? 文件...
? 常用命令選項
? ? -F :指定分隔符,可省略(默認空格或Tab)
二 . 使用awk提取文本
?2.1 實例1 (直接過濾文件內容)
[root@client?~]#?cat?awktest.txt? hello?the?world this?is??shanghai [root@client?~]#?awk?'{print?$1,$3}'?awktest.txt? hello?world this?shanghai2.2 實例2 (打印磁盤剩余空間)
[root@client?~]#?df?-h?|?awk?'{print?$4}' 可用 14G 897M 912M 903M 912M 0 836M 183M 183M2.3 實例3 (輸出passwd文件中以分號分隔的第1、7個字段,顯示的不同字段之間以逗號隔開)
[root@client?~]#?awk?-F:?'{print?$1,$7}'?/etc/passwd root?/bin/bash bin?/sbin/nologin daemon?/sbin/nologin adm?/sbin/nologin lp?/sbin/nologin ...?...2.4 實例4 (awk的print指令不僅可以打印變量,還可以打印常量)
2.5 實例5 (提取網卡信息中RX bytes與TX bytes)
[root@client?~]#?ifconfig?ens33?|?awk?'/RX?p/{print?$5}'? 85570 [root@client?~]#?ifconfig?ens33?|?awk?'/TX?p/{print?$5}'? 94377三 . awk過濾的時機
?在所有行前處理,BEGIN{ }
? 讀入第一行文本之前執行
? 一般用來初始化操作
逐行處理,{ }
? 逐行讀入文本執行相應的處理
? 是最常見的編輯指令塊
在所有行后處理,END{ }
? 處理完最后一行文本之后執行
? 一般用來輸出處理結果
?3.1? 實例1
[root@client?~]#?awk?'BEGIN?{a=35;print?a+12}' 473.2? 實例2 (統計系統中使用bash作為登錄Shell的用戶總個數)
[root@client?~]#?awk?'BEGIN{x=0}/bash$/{x++}?END{print?x}'?/etc/passwd 5四 . awk處理時機
?4.1 正則表達式
? ?? 實例1
[root@client?~]#?awk?-F:?'/^ro/{print}'?/etc/passwd root:x:0:0:root:/root:/bin/bash? ? 實例2
[root@client?~]#?awk?-F:?'$7!~/bash$/{print?$1,$7}'?/etc/passwd bin?/sbin/nologin daemon?/sbin/nologin adm?/sbin/nologin lp?/sbin/nologin sync?/bin/sync shutdown?/sbin/shutdown4.2 數值比較
==等于、!=不等于
>大于、>=大于或等于
<小于、<=小于或等于
?? 實例1
[root@client?~]#?cat?awkreg.txt abcd?xx xx? abcabcd?xx [root@client?~]#?awk?'NR==2{print}'?awkreg.txt??????//輸出第二行文本 xx [root@client?~]#?awk?'$2!="xx"{print}'?awkreg.txt???//輸出第二列不是xx的行 xx? [root@client?~]#?awk?'NF>=2{print}'?awkreg.txt??????//輸出包含2個及以上字段的行 abcd?xx abcabcd?xx4.3 邏輯比較測試
? && 邏輯與:期望多個條件都成立
? || 邏輯或:只要有一個條件成立立即滿足要求
實例
[root@client?~]#?awk?-F:'$3>=0&&$3<2{print$1,$3}'?/etc/passwd??//列出UID小于2的用戶信息 root?0 bin?1 [root@client?~]#?awk?-F:'$3==1||$3==7{print$1,$3}'?/etc/passwd??//列出UID為1或7的用戶信息 bin?1 halt?74.4 運算符
+、-、*、/、%
++、--、+=、-=、*=、/=
?實例
[root@client?~]#?awk?'NR%2==1{print}'?awkreg.txt? abcd?xx abcabcd?xx [root@client?~]#?awk?'BEGIN{i=0}{i+=NF}END{print?i}'?awkreg.txt? 5五 . awk流程控制
分支結構
?單分支
?? if(條件){編輯指令}
?雙分支
?? if(條件){編輯指令1}else{編輯指令2}
?多分支
?? if(條件){編輯指令1}else if(條件){編輯指令2}.. ..
? ? else{編輯指令N}
5.1 單分支實例
5.2 雙分支實例
[root@client?~]#?awk?-F:?'{if($3<=500){i++}else{j++}}END{print?i,j}'?/etc/passwd//分別統計/etc/passwd文件中UID小于或等于1000、UID大于1000的用戶個數 30?13 [root@client?~]#?awk?-F:?'{if($7~/bash$/){i++}else{j++}}?END{print?i,j}'?/etc/passwd//分別統計/etc/passwd文件中登錄Shell是“/bin/bash”、?登錄Shell不是“/bin/bash”的用戶個數 5?38六 . awk數組
數組的定義及使用
?定義數組
?? 格式:數組名[下標]=元素值
調用數組
?? 格式:數組名[下標]
遍歷數組
?? 用法:for(變量 in 數組名){print 數組名[變量]}
6.1 實例
[root@svr5?~]#?awk?'BEGIN{a[0]=11;a[1]=88;print?a[1],a[0]}' 88?11 [root@svr5?~]#?awk?'BEGIN{a++;print?a}' 1 [root@svr5?~]#?awk?'BEGIN{a0++;print?a0}' 1 [root@svr5?~]#?awk?'BEGIN{a[0]++;print?a[0]}' 1 [root@svr5?~]#?awk?'BEGIN{a[0]=00;a[1]=11;a[2]=22;?for(i?in?a){print?i,a[i]}}' 0?0 1?11 2?22轉載于:https://blog.51cto.com/11483827/2366302
總結
以上是生活随笔為你收集整理的linux三剑客之awk (用于个人学习以及回顾)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java获取小程序带参二维码(太阳码)
- 下一篇: linux命令之vmstat