Linux生產環境上,最經常使用的一套「AWK「技巧

hi,你們好,小姐姐味道最有用系列完結。記得多多轉發,點贊哦。python

最有用系列:編程

《Linux生產環境上,最經常使用的一套「vim「技巧》vim

《Linux生產環境上,最經常使用的一套「Sed「技巧》設計模式

《Linux生產環境上,最經常使用的一套「AWK「技巧》數組

《"Sed" 高級功能:我這小腦瓜都快繞暈了》bash

敢用本身的名字作軟件名字的,都有很是強大的自信。好比,垠語言什麼的。網絡

awk的命名得自於它的三個創始人姓別的首字母,都是80來歲的老爺爺了。固然也有四我的的組合:流行的GoF設計模式。但對於我這遊戲愛好者來講,想到的居然是三位一體,果真是不爭氣啊。tcp

它長的很像C,爲何這麼有名,除了它強大的功能,咱們姑且認爲a這個字母比較靠前吧。awksed簡單,它更像一門編程語言。編程語言

打印某一列

下面,這幾行代碼的效果基本是相同的:打印文件中的第一列。函數

#Java
System.out.println(aStr.split(" ")[0]);

#Python
print(aString.split(" ")[0])

#cut 命令
cut -d " " -f1   file

#awk命令
awk '{print $1}' file
複製代碼

這多是awk最經常使用的功能了:打印文件中的某一列。它智能的去切分你的數據,不論是空格,仍是TAB,大機率是你想要的。

對於csv這種文件來講,分隔的字符是,。AWK使用-F參數去指定。如下代碼打印csv文件中的第1和第2列。

awk -F ","  '{print $1,$2}' file
複製代碼

由此,咱們能夠看出一個基本的awk命令的組成部分。

通常的開發語言,數組下標是以0開始的,但awk的列$是以1開始的,而0指的是原始字符串。

網絡狀態統計

本小節,採用awk統計netstat命令的一些網絡狀態,來看一下awk語言的基本要素。netstat的輸出相似於:

其中,第6列,標明瞭網絡鏈接所處於的網絡狀態。咱們先給出awk命令,看一下統計結果。

netstat  -ant | 
awk ' \ BEGIN{print "State","Count" } \ /^tcp/ \ { rt[$6]++ } \ END{ for(i in rt){print i,rt[i]} }'
複製代碼

輸出結果爲:

State Count
LAST_ACK 1
LISTEN 64
CLOSE_WAIT 43
ESTABLISHED 719
SYN_SENT 5
TIME_WAIT 146
複製代碼

下面這張圖會配合以上命令詳細說明,但願你能瞭解awk的精髓。

乍一看,好嚇人的命令,可是很簡單。awk和咱們一般的程序不太同樣,它分爲四個部分。

一、BEGIN 開頭部分,可選的。用來設置一些參數,輸出一些表頭,定義一些變量等。上面的命令僅打印了一行信息而已。

二、END 結尾部分,可選的。用來計算一些彙總邏輯,或者輸出這些內容。上面的命令,使用簡單的for循環,輸出了數組rt中的內容。

三、Pattern 匹配部分,依然可選。用來匹配一些須要處理的行。上面的命令,只匹配tcp開頭的行,其餘的不進入處理。

四、Action 模塊。主要邏輯體,按行處理,統計打印,均可以。

注意點

一、awk的主程序部分使用單引號‘包圍,而不能是雙引號 二、awk的列開始的index是0,而不是1

例子

咱們從幾個簡單的例子,來看下awk的做用。

一、輸出Recv-Q不爲0的記錄

netstat -ant | awk '$2 > 0 {print}'
複製代碼

二、外網鏈接數,根據ip分組

netstat -ant | awk '/^tcp/{print $4}' | awk -F: '!/^:/{print $1}' | sort | uniq -c
複製代碼

三、打印RSS物理內存佔用

top -b -n 1 | awk 'NR>7{rss+=$6}END{print rss} 複製代碼

四、過濾(去掉)空白行

awk 'NF' file
複製代碼

五、打印奇數行

awk 'a=!a' file
複製代碼

六、輸出行數

awk 'END{print NR}' file
複製代碼

這些命令,是須要了解awk的一些內部變量的,接下來咱們來介紹。

內置變量

FS

下面的兩個命令是等價的 。

awk -F ':'  '{print $3}' file
awk 'BEGIN{FS=":"}{print $3}' file
複製代碼

**BEGIN塊中的FS,就是內部變量,能夠直接指定或者輸出。**若是你的文件既有用,分隔的,也有用:分割的,FS甚至能夠指定多個分隔符同時起做用。

FS="[,:|]"
複製代碼

其餘

OFS 指定輸出內容的分割符,列數很是多的時候,簡化操做。類似命令:

awk -F ':' '{print $1,"-",$2,"-",$4}' file
awk 'BEGIN{FS=":";OFS="-"}{print $1,$2,$4}' file 
複製代碼

NF 列數。很是有用,好比,過濾一些列數不知足條件的內容。

awk -F, '{if(NF==3){print}}' file
複製代碼

NR 行號,例如,下面兩個命令是等價的。

cat -n file
awk '{print NR,$0}' file
複製代碼

RS 記錄分隔標誌 ORS 指定記錄輸出的分隔標誌

FILENAME 當前處理的文件名稱,在一次性處理多個文件時很是有用

編程語言特性

數學運算

從上面的代碼能夠看出,awk能夠作一些簡單的運算。它的語言簡潔,不須要顯示的定義變量的類型。

好比上面的rt[$6]++,就已經默認定義了一個叫作rt的hash(array?),裏面的key是網絡狀態,而value是能夠進行運算的(+-*/%)。

包含一些內置的數學運算(有限)

int
log
sqrt
exp
sin
cos
atan2
rand
srand
複製代碼

字符串操做

相似其餘語言,awk也內置了不少字符串操做函數。它原本就是處理字符串的,因此必須強大。

length(str) #獲取字符串長度
split(input-string,output-array,separator)
substr(input-string, location, length)
複製代碼

語言特性

awk是個小型的編程語言,看它的基本語法,若是你須要複雜一點的邏輯,請自行深刻了解,包括一些時間處理函數:

# logic
if(x=a){}
if(x=a){}else{}
while(x=a){break;continue;}
do{}while(x=a)
for(;;){}

# array
arr[key] = value
for(key in arr){arr[key]}
delete arr[key]

asort(arr) #簡單排序
複製代碼

聽說,awk能夠勝任全部的文本操做。由於它自己就是一門語言啊。

End

曾經使用awk編寫過複雜的日誌處理和統計程序。雖然比寫sed舒暢了不少,但仍是備受煎熬。更加上如今有各類nawk,gawk版本之間的區別,因此業務複雜度一增加,就習慣性的轉向更加簡潔、工具更全的python。

awk處理一些簡單的文本仍是極其方便的,最經常使用的仍是打印某一列之類的,包括一些格式化輸出。對於awk,要簡單的倒背如流,複雜的耳熟能詳,畢竟有些大牛,就喜歡寫這種腳本呢。

更多精彩文章。

《微服務不是所有,只是特定領域的子集》

《「分庫分表" ?選型和流程要慎重,不然會失控》

這麼多監控組件,總有一款適合你

《Kafka消息系統基礎知識索引》

《使用Netty,咱們到底在開發些什麼?》

Linux五件套之類的。

《Linux之《荒島餘生》(一)準備篇》

《Linux之《荒島餘生》(二)CPU篇》

《Linux之《荒島餘生》(三)內存篇》

《Linux之《荒島餘生》(四)I/O篇》

《Linux之《荒島餘生》(五)網絡篇》

相關文章
相關標籤/搜索