三劍客之awk命令----------大漠孤煙直,長河落日圓。
阿新 • • 發佈:2021-07-28
三劍客之awk命令
一、簡介
awk命名源自於它的三大作者名字的首字母,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。(gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴充套件)。
awk 是一種程式語言,用於在linux/unix下對文字和資料進行處理。資料可以來自標準輸入、一個或多個檔案,或其它命令的輸出。它支援使用者自定義函式和動態正則表示式等先進功能,是linux/unix
下的一個強大程式設計工具。它在命令列中使用,但更多是作為指令碼來使用。
awk的處理文字和資料的方式是這樣的,它逐行掃描檔案,從第一行到最後一行,尋找匹配的特定
模式的行,並在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出(
螢幕),如果沒有指定模式,則所有被操作所指定的行都被處理
awk 格式
-F 定義欄位分隔符 ,預設是空格 #兩種語法格式 awk [optinos] 'commands' filename awk [optinos] -f awk-script-file filename # awk命令由三部分組成 GEGIN{} #讀取所有行之前做的事情 {} #讀一行處理一行 END{} #讀完之後要做的事情 可以省略BEGIN{}END{},只進行{}處理,並且{}可以加匹配,成功後在處理 示例: awk -F: '/root/{print $1,$3}' /etc/passwd df -P |awk '$4 > 999999{print $0}' #{print $0}可以省略,有預設輸出
二、工作原理
1.awk會接收一行作為輸入,並將這一行賦給awk的內部變數$0,每一行也可稱為一個記錄,行的邊界是以換行符作為結束
2.讀入的行,分隔符分解成若干欄位,每個欄位儲存在編好的變數中,從$1開始,最多有100多個欄位
3.使用print函式列印,OFS預設空格,如果列印$1,$3逗號分開,就會預設打印出來進行空格分開。可以自行設定OFS
三、記錄與欄位相關內部變數
$0 當前行的內容
NR 記錄號,行號,處理完一條NR+1
NF 儲存記錄的欄位數,如$1,$2
FS 輸入欄位分隔符,預設空格
OFS 輸出欄位分割符,預設空格
$NF 最後一列
四、格式化輸出
%s 字元型別 $d 數值型別 - 表示左對齊,預設是右對齊 printf預設不會再行尾自動換行,需要自行加\n awk -F: '{printf "|%-15s|%-15s|%-15s|\n",$1,$2,$3}' /etc/passwd
五、模式pattern與動作action
1.正則表示式
awk -F: '/egon/{print $1,$3}'
awk '$1 ~ /^root/' /etc/passwd
awk '$7 !~ /bash$/' /etc/passwd
2.比較表示式---條件為真,再執行
< #小於
<= #小於等於
> #大於
>= #大於等於
== #等於
!= #不等於
~ #匹配
!~ #不匹配
3.算數運算
+ - * / % ^
4.邏輯運算和複合運算
&& #邏輯與
|| #邏輯或
! 邏輯非
# awk '!($2 < 100 && $3 < 20)' filename
5.範圍模式
NR > 3 && NR < 5 NR==3
awk '/root/,/egon/' /etc/passwd
awk '/root/,/jerry/{print NR,$1}' /etc/passwd
七、流程控制
條件判斷:if else if else ==
{if (表示式) {語句;語句;...}
awk -F: '{if ($3==0){i++} else if ($>499){k++}else {j++}} END{print "管理員個數:"i;print"普通使用者個數:"k;print"系統使用者:"j}' /etc/passwd
while 迴圈
awk -F: 'i=1;while(i<=10) {print $0;i++}' /etc/passwd
for迴圈
awk -F: '{for(i=1;i<=10;i++) print $0}' /etc/passwd
陣列(索引或key對應值)
# awk -F: '{username[++i]=$1} END{print username[1]}' /etc/passwd
# awk -F: '{username[i++]=$1} END{print username[1]}' /etc/passwd
# awk -F: '{username[i++]=$1} END{print username[0]}' /etc/passwd
# awk -F: '{username[x++]=$1} END{for(i=0;i<NR;i++) print i,username[i]}' /etc/passwd
練習題
1. 取得網絡卡IP(除ipv6以外的所有IP)
2. 獲得記憶體使用情況
3. 獲得磁碟使用情況
4. 清空本機的ARP快取
5. 打印出/etc/hosts檔案的最後一個欄位(按空格分隔)
6. 列印指定目錄下的目錄名
7.已知一個變數 msg="I am a teacher, my name is egon",列印字元長度小於3的單詞