awk 是一種程式語言,用於在linux/nuix下對文字和資料進行處理。資料可以來自標準輸入、乙個或多個檔案,或其它命令的輸出。它支援使用者自定義函式和動態正規表示式等先進功能,是linux/unix下的乙個強大的程式設計工具。它在命令列中使用,但更多是作為指令碼來使用。
awk 的處理文字和資料的方式是這樣的,它逐行掃瞄檔案,從第一行到最後一行,尋找匹配的特定模式的行,並在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出(螢幕),如果沒有指定模式,則所有被操作所指定的行都被處理。awk分別代表其作者姓氏的第乙個字母。因為它的作者是三個恩,分別是alfred aho、brian kernighan、peter weinberger。gawk是awk的gnu版本,它提供了bell實驗室和gnu的一些擴充套件。
(1)命令列模式:awk [options] 『commands』 file(s)
(2)指令碼模式:awk [options] -f scriptfile file[s]
awk [options] 『commands』 file(s)
option:
-f 定義字段分割符號
-v 定義變數並賦值
command:
1、範圍說明或者正規表示式或者
2、範圍說明部分可以是begin、end、邏輯表示式或者為空
3、awk命令語句間用分號間隔
4、引用shell變數時需要用雙引號引起,命令模式都在單引號』'裡面
begin{} {} end{}
行處理前 行處理 行處理後
字段分割及相關變數$1,$2,$3
...$n:awk中用該順序形式表示files中每行以間隔符號分割的各列的不同字段
$0 表示文字本身
nf 表示當前記錄的字段數(列數)
$nf 最後一列
$(nf-1)
倒數第二列
fnr/nr 行號
filename 檔名
"\t" 製表符
rs 換行符
"" 列印字串
fs 定義間隔符
~ 匹配,與==相比不是精確比較
!~ 不匹配,不精確比較
== 等於,必須全部相等,精確比較
/[0-9]
[0-9]+/ 兩個或兩個以上數字
-f'[:#/]' 定義三個分隔符
awk –f: '' /etc/passwd
awk'' /etc/fstab ;
awk end '' /etc/fstab
awk -f:'' /etc/passwd
格式化輸出:%c:顯示字元的ascii碼
%d, %i:顯示十進位制整數
%e, %e:顯示科學計數法數值
%f:顯示為浮點數
%g, %g:以科學計數法或浮點形式顯示數值
%s:顯示字串
%u:無符號整數
%%:顯示%自身
awk -f: '' /etc/passwd
awk -f: '' /etc/passwd
awk -f: '' /etc/passwd
awk -f: '' /etc/passwd
awk -f: '' /etc/passwd
awk -f: '' /etc/passwd
awk -f: '' /etc/passwd
任何awk語句都由模式和動作組成。模式部分決定動作語句何時觸發及觸發事件。處理即對資料進行的操作。如果省略模式部分,動作將時刻保持執行狀態。模式可以是任何條件語句或復合語句或正規表示式。模式包括兩個特殊字段 begin和end。使用begin語句設定計數和列印頭。begin語句使用在任何文字瀏覽動作之前,之後文字瀏覽動作依據輸入文字開始執行。end語句用來在awk完成文字瀏覽動作後列印輸出文字總數和結尾狀態。
模式可以是:正規表示式、比較表示式、條件表示式、算術運算子、邏輯操作符和復合模式、範圍模式等。
正規表示式
匹配字段:匹配操作符(~ !~)
awk'/^uuid/' /etc/fstab
awk'!/^uuid/' /etc/fstab
行範圍
awk -f: 『/^root\>/,/^nobody\>/
' /etc/passwd
awk -f: 『(nr>=10&&nr<=20)' /etc/passwd
條件表示式:awk -f: '$3>300 ' /etc/passwd
awk -f: '' /etc/passwd
awk -f: ' }' /etc/passwd
awk -f: ' else }' /etc/passwd
算術運算:+ - * / % ^awk -f: '$3 * 10 > 500' /etc/passwd
邏輯操作符:與&&,或||,非!awk -f: '$3>=0 && $3
<=1000 ' /etc/passwd
awk -f: '$3==0 || $3>=1000 ' /etc/passwd
awk -f: '!($3==0) ' /etc/passwd
awk -f: '!($3>=500) ' /etc/passwd
條件表示式(三目表示式) selector?if-true-expression:if-false-expression
awk控制語句if-elseawk -f: '' /etc/passwd
df -h|
awk -f% '/^\/dev/'
|awk
'$nf>=80'
while迴圈awk
'/^[[:space:]]*linux16/}' /etc/grub2.cfg
awk'/^[[:space:]]*linux16/; i++}}' /etc/grub2.cfg
for迴圈awk
'/^[[:space:]]*linux16/}' /etc/grub2.cfg
陣列netstat -tan |
awk'/^tcp/ end}'
awk'end}' /var/log/httpd/access_log
函式rand(
):返回0和1之間乙個隨機數
awk'begin'
cat fun.awk
function max(x,y)
begin
awk -f fun.awk
綜合練習
查詢netstat -nt命令的結果中foreign address列的位址,統計每個位址鏈結的次數,如果⼤於2次,顯⽰ip
netstat -nt |
awk'/^tcp/'
|awk -f: ''
|sort
|uniq -c|
awk'$1>1'
172.18.116.232
模擬併發訪問http服務,查詢ip連線次數超過200次的訪問ip位址 模擬併發
顯⽰超過200次訪問的ip:
顯⽰磁碟使⽤率⼤於等於8%的分割槽
df -h|
awk -f% '/^\/dev/'
|awk
'$nf>=8'
查詢連線本機的次數⼤於20的ip位址,加⼊到防⽕牆禁⽌連線
ss -nt |
awk -f'[ :]+'
'!/state/end}'
|while
read line;
do ip=
`echo $line |
awk''`;
[ -z "$ip"
]|| iptables -a input -s $ip -j reject;
done
解決dos攻擊⽣產案例:根據web⽇志或⽹絡連線數,監控當某個ip併發連線 數或者短時間內pv達到100,即調⽤防⽕牆命令封掉對應的ip,監控頻率每隔5分 鐘;防⽕牆命令為iptables -a input -s ip -j reject
使⽤netstat和awk統計伺服器出現tcp⽹絡狀態並按數量排序?
netstat -tan |
grep
"^tcp\b"
|awk''|
sort
|uniq -c|
sort -nr
Linux awk命令詳解
3.awk的執行過程 1 awk script的組成 awk script可以由一條或多條awk cmd組成,兩條awk cmd之間一般以newline分隔 awk cmd由兩部分組成 awk pattern awk script可以被分成多行書寫,必須確保整個awk script被單引號括起來。2...
linux awk命令詳解
awk 儘管操作可能會很複雜,但語法總是這樣,其中 pattern 表示 awk 在資料中查詢的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號 不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。pattern就是要表示的正規表示式,用斜槓括起來。awk 語言...
linux awk命令詳解
awk是乙個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。awk有3個不同版本 awk nawk和gawk,未作特別說明,一般指gawk,gawk...