1. 程式人生 > >linux學習-awk工具

linux學習-awk工具

方法 創建 false tab linux學習 註意 img type 以及

awk是基於列的文本處理工具,它的工作方式是按行讀取文本並視為一條記錄,每條記錄以字段分割成若幹字段,然後輸出個字段的值,事實上,awk是一種編程語言。awk認為文件都是結構化的,也就是說由單詞和各種空白字符組成的,這裏的‘空白字符’包括空格,Tab,以及連續的空格和tab等。每個非空白的部分叫做域,從做到右依次是第一個域,第二個域,等等。$1、$2分別用於表示域,$0則表示全部域。

首先創建Awk.txt文件,文件內容如下所示:

john.wang	Male	30	021-1111111
lucy.yang	Female	25	021-2222222
jack.chen	Male	35	021-3333333
lily.gong	Female	20	021-4444444	ShangHai


打印指定域

既然awk使用$1,$2代表不同的域,則可以打印指定域。拿Awk.txt的第一行來說,第一個域為john.wang,第二域為Male,第三個域為30,第四個域為021-1111111。在下面的演示中,第一條命令打印了$1、$4這兩個域,而第二條命令打印了全部的域。

#只打印姓名和電話號碼
awk '{print $1,$4}' Awk.txt

技術分享圖片

#打印全部內容
awk '{print $0}' Awk.txt

技術分享圖片


指定打印分隔符

默認情況下awk是使用空白字符作為分隔符的,但是也可以通過-F指定分隔符,來區分不同的域

#指定“.”作為分隔符,這樣每一行的$1就是“.”之前的字符,$2就是“.”之後的字符
比如說第一行的$1是"john",$2是"Male     30    02101111111"
awk -F. '{print $1,$2}' Awk.txt

技術分享圖片


內部變量NF

有時候文件很大,每行列數都不一樣,必須通過特定的方式獲取文件列數。通過awk的內部變量NF可以簡單的做到這一點。當然,如果你指定了不同的分隔符,結果可能不一樣。

#使用默認分隔符
awk '{print NF}' Awk.txt

技術分享圖片

#使用指定分隔符
awk -F. '{print NF}' Awk.txt

技術分享圖片

打印固定域

通過內部變量可以簡單的得到每行的列數,而如果在NF之前加上$符號,則代表的是“最後一列”,這樣不管每行有多少列,只要使用$NF就能打印最後一行。

#打印最後一列
awk '{print $NF}' Awk.txt

技術分享圖片

#打印倒數第二行
awk '{print $NF}' Awk.txt

技術分享圖片


截取字符串

可以使用substr()函數對指定域截取字符串,該函數的基本使用方法如下:

substr(指定域,第一個開始字符的位置,第二個結束的位置),其中第二結束的位置可以為空,這樣默認的輸出到該域的最後一個字符

下例將輸出Awk.txt文件第一個域的第六個字符到最後一個字符的內容:

#註意,第二個結束位省略,所以結束位置為第一個域的最後一個字符
cat Awk.txt | awk '{print substr($1,6)}'

技術分享圖片


確定字符串長度

使用內部變量length可以確定字符串的長度,示例如下:

cat Awk.txt | awk '{print length}'

技術分享圖片


使用awk求列和

結構化的數據是非常常見的,在日常工作中,經常有將其中的數據進行相加的需求,以下為對Awk.txt中年齡進行的一些計算。請註意,年齡字段是第三個域。

#求年齡的和
cat Awk.txt | awk 'BEGIN{tolal=0}{total+=$3}END{print total}'
#求平均年齡
cat Awk.txt | awk 'BEGIN{tolal=0}{total+=$3}END{print total/NR}'


linux學習-awk工具