linux的awk命令
A. linux三劍客awk命令篇二:命令操作符
Linux三劍客awk命令篇二:命令操作符
關於awk的原理等基本知識請參考上篇:
Linux三劍客awk命令篇一:原理及基本命令
補充
1、語法格式:
(1) Awk完整語法
awk 'BEGIN{commands} pattern{commands}END{commands} ' file
BEGIN{commands}:處理數據前執行的命令。
END{commands}:處理完數據後執行的命令。
這兩個命令可以省略。見(2)
(2) Awk基本語法
awk -F '分割符' '/模式/{動作} ' file
這里的 '/模式/{動作} ' 類似於sed的命令格式。
模式:
(1) 正則表達式(注意格式: /正則表達式/ )
(2) 條件表達式(例如:> <等等)
總結:
這里的模式通俗來講是 用來找誰, 而動作表示是 幹啥。
2、 awk的命令操作符
(1) 正則表達式與bash一致
(2) + - * / % ++ --
(3) && || !
(4) > < >= <= != == ~ !~
~:表示匹配後面的模式,用於欄位,見 案例1 。
其餘的都比較常見就不舉例了。
3、案例
案例1:
~使用案例
awk -F : '$3 ~ /<...>/{print $1,$3}' /etc/passwd
解釋:
模式:<...>
< >表示定界符,只匹配3個字元。
$3 ~:表示$3這個欄位必須符合後面模式(<...>)的要求。
見如下輸出結果,$3都是3個字元。
案例2:
% || ==使用案例
seq 100 | awk '$1 % 7 == 0 || $1 ~ /^99/{print $1}'
輸出結果的要求:
整除7或者以99開頭
案例3:
++使用
awk 'BEGIN{num=0}{num++}END{print num}' /etc/passwd
簡單解釋:
BEGIN{num=0}:定義一個變數num
{num++}:這里沒有模式,只有動作。
即每匹配到文件/etc/passwd的一行就執行num++
END{print num}:文件遍歷結束,列印num的值,即文件的行數。
這里我們使用wc -l驗證也是沒問題的。
cat /etc/passwd | wc -l
上面3個案例簡單的使用了awk的命令操作符。
雖然只是用到了幾個簡單的,但是其他同理,大家可以執行操作。
下一篇:
Linux三劍客awk命令篇二之內部變數
歡迎大家給予寶貴的意見或者建議。
歡迎大家補充或者共享一些其他的方法。
感謝支持。
B. Linux入門系列——awk命令詳解
awk是一個強大的文本分析工具,與grep、sed相比,awk在對數據分析並生成報告時,顯得有很大的優勢。
awk有三個不同的版本:awk、nawk和gawk,在沒有做特殊說時的時候默認的就是gawk,gawk是awk的GNU版本。
其中command是真正的awk命令,-F表示域的分隔符,是個可選項。Filename是等待處理的文件
將所有的awk命令寫入到一個文件,並使用該文件有X許可權,然後awk命令解釋器作為腳本的首行,也就是說可以把腳本最開始的 #!/bin/bash 換成 #!/bin/awk
最後直接執行這個腳本文件就行了。
-f 指定要載入的awk腳本,是一個文件。Filename是等待處理的文件
awk的工作流程是這樣的:讀入一行後(最後面帶有」 」的),就按-F指定的分隔符來將該行劃分成N個區域,$0表示所有的區域,$1表示第一個域,$2表示第二個域,依此類推,$n表示第n個域。
總結:awk先執行BEGIN內的命令,然後再讀入文件中的行,接著就是按照指定的分隔符將該行分成N個區域,然後再來執行模式所對應的動作action。然後,再來讀入第二行。。再重復執行action,直到所有的行都處理完成。最後再執行END中的命令。
注意:' // '之間是支持正則表達式的,如果此處只有pattern,而沒有action,那麼awk默認會把匹配到的行列印出來。
awk中的print還可以使用C語言中的printf來替代。在輸出格式比較復雜的時候使用printf函數會比print函數要更直觀一些,如下:
還可以使用-v key=value來自定義變數。如下:
awk中的條件語句是從C中借鑒過來的
語法:if (condition) {then-body} else {else-body}
例如使用awk來統計某個目錄下的普通文件的大小,不包括子目錄的,並過濾掉目錄。
循環語句也和C中的一樣,支持while、do/while、for、continue、break等關鍵字。
break和continue常用於循環中;
在awk中,數組的下標可以是數字或字母。一般awk中的數組的作用是從記錄中收集信息,用於計算總和、統計單詞等。
在awk中要刪除一個元素的時候使用 delete array[index]
更多請參見awk官方文檔[http://www.gnu.org/software/gawk/manual/gawk.html]
C. Linux awk 命令詳解(二) if 分支 數組
一、awk if分支結構
二、awk數組 for循環
一、awk if分支結構
案例1
awk過濾中的if分支結構
1)單分支
統計/etc/passwd文件中UID小於或等於1000的用戶個數:
統計/etc/passwd文件中UID大於1000的用戶個數:
統計/etc/passwd文件中登錄Shell是「/bin/bash」的用戶個數:
2)雙分支
分別統計/etc/passwd文件中UID小於或等於1000、UID大於1000的用戶個數:
分別統計/etc/passwd文件中登錄Shell是「/bin/bash」、 登錄Shell不是「/bin/bash」的用戶個數:
二、awk數組
注意,awk數組的下標除了可以使用數字,也可以使用字元串,字元串需要使用雙引號:
案例3:awk擴展應用
1)awk統計Web訪問排名
在分析Web日誌文件時,每條訪問記錄的第一列就是客戶機的IP地址,其中會有很多重復的IP地址。因此只用awk提取出這一列是不夠的,還需要統計重復記錄的數量並且進行排序。
通過awk提取信息時,利用IP地址作為數組下標,每遇到一個重復值就將此數組元素遞增1,最終就獲得了這個IP地址出現的次數。
針對文本排序輸出可以採用sort命令,相關的常見選項為-r、-n、-k。其中-n表示按數字順序升序排列,而-r表示反序,-k可以指定按第幾個欄位來排序
實現此案例需要按照如下步驟進行。
步驟一:統計Web訪問量排名
分步測試、驗證效果如下所述。
1)提取IP地址及訪問量
2)對第1)步的結果根據訪問量排名
案例4:編寫監控腳本
本案例要求編寫腳本,實現計算機各個性能數據監控的功能,具體監控項目要求如下:
CPU負載
網卡流量
內存剩餘容量
磁碟剩餘容量
計算機賬戶數量
當前登錄賬戶數量
計算機當前開啟的進程數量
本機已安裝的軟體包數量
步驟
實現此案例需要按照如下步驟進行。
步驟一:准備工作
1)查看性能數據的命令
步驟二:編寫參考腳本
1)腳本內容如下:
D. linux awk命令怎麼用
awk命令是Alfred Aho, Peter Weinberger, Brian Kernighan三位作者聯合開發的,用於Linux/Unix中處理數據和產生報告。awk命令功能十分強大,可根據需要抓取、截取指定的列或行。
首先在/mnt目錄下創建示例文本文件f1,其內容如下:
1 hello hello
2 data data
3 xyz abc
4 123 789
5 ftp
6 Apache
7 apache
然後,使用awk對f1文件內容進行處理,舉例如下。
①awk -F " " '{print $2,$3}' f1:截取顯示文檔的第二列和第三列,-F指定分隔符為空格,$表示顯示第幾列。其中print表示要做輸出信息的動作,$2和$3表示要輸出的列號,awk要求將print已經輸出列等內容放在「'{}'」之間。
②awk -F " " '($1>3){print $2,$3}' f1:選取第一列的值大於3的行,顯示其第二列和第三列,在「()」中指定篩選條件。
③awk 'NR==4 || NR==3' f1:顯示第三行和第四行,NR表示行號。
④awk '/data/ {print $2}' f1:抓取包含指定字元的行,再對列進行截取。此例中,awk先按照「data」字元串對文件f1中的行篩選,找出包含「data」的行以後,再按照默認的空格作為分隔符對行的內容做切割,僅列印出第二列的內容。
⑤awk '$2 ~ /data/ ' f1:抓取第二列包含指定字元的行。其中「~」表示是否匹配指定的「data」,如果第二列的內容包含「data」就列印出整行內容。
⑥awk '$2 !~ /data/ ' f1:抓取第二列不包含指定字元的行。其中「!~」表示是否不匹配指定的「data」,如果第二列的內容不包含「data」就列印出整行內容。
E. linux里awk是做什麼的,請詳細說明
awk語言的最基本功能是在文件或字元串中基於指定規則來分解抽取信息,也可以基於指定的規則來輸出數據。完整的awk腳本通常用來格式化文本文件中的信息。
你比如:
echo "11|22|33" | awk -F "|" '{print $2}'
F. linux awk命令--如何引入外部變數
用shell命令刪除目錄下文件,但是排除某些特殊文件,第一時間無腦從谷歌獲取。
丟到腳本執行發現,並沒有刪除,原來rm後面命令返回結果有問題,必須事當前目錄才行,腳本脫離當前目錄就懵逼。那想辦法改吧。
既然【 ls *.txt | grep -v test.txt 】返回的的是文件名稱,那拼上目錄就完事了。
使用awk拼接目錄和文件:
由於【ls -l 】返回的第一行【total 272】需過濾:
過濾第一行統計信息:
awk內置了一些變數可以拼接,還有常量也可以拼接,此處不表,重點提及awk作用域外的變數引用,有一下三種方式:
格式如:awk 『{action}』 變數名=變數值 ,這樣傳入變數,可以在action中獲得值。 注意:變數名與值放到』{action}』後面。
這種變數在:BEGIN的action不能獲得。
格式如:awk –v 變數名=變數值 [–v 變數2=值2 …] 'BEGIN{action}』 注意:用-v 傳入變數可以在3中類型的action 中都可以獲得到,但順序在 action前面。
只需要調用:awk內置變數 ENVIRON,就可以直接獲得環境變數。它是一個字典數組。環境變數名 就是它的鍵值。