Linux awk命令詳解

2021-09-29 08:27:13 字數 4902 閱讀 6645

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-else
awk -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...