linux學習-awk工具
阿新 • • 發佈:2018-07-16
方法 創建 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工具