首頁 > 軟體

Linux awk命令使用

2020-06-16 17:34:43

本文主要介紹了Linux中的awk命令的一些知識以及如何使用awk程式設計。不同於grep的查詢、sed的編輯等命令,awk命令在文字處理和生成報告等地方是經常用到的一個強大命令。

簡介

awk命令主要用於文字分析。它的處理方式是讀入文字,將每行記錄以一定的分隔符(預設為空格)分割成不同的域,然後對不同的域進行各種處理與輸出。

命令格式

awk命令的一個基本格式如下:

1
awk '{pattern + action}' {filenames}

無論awk命令簡單還是複雜,基本的格式如上所示。其中引號為必須,引號內代表一個awk程式。大括號非必須,括起來用於根據特定的模式對一系列指令進行分組。pattern是在資料中查詢內容,支援正則匹配。action對查詢出來的記錄執行相應的處理,比如列印和輸出等。

awk三種呼叫方式

命令列方式

1
awk [-F 'field-separator'] 'commands' input-file(s)

其中的-F指令是可選的,後面跟著指定的域分隔符,比如tab鍵等(預設是空格)。後面的commands是真正的awk命令。input-file(s)代表輸入的一個或多個檔案

命令列呼叫方式是最經常使用的一種方式,也是本文所講的重點。

shell指令碼方式

把平時所寫的shell指令碼的首行#!/bin/sh換成#!/bin/awk。把所有的awk命令插入指令碼中,通過呼叫指令碼來執行awk命令。

插入檔案呼叫

把所有的awk命令插入單獨的檔案中,然後通過以下命令呼叫awk:

1
awk -f awk-script-file input-file(s)

其中-f指定了要呼叫的包含awk命令的檔案。

awk應用範例

列印指定欄位

列印當前目錄下所有的檔名和檔案大小列表,以tab鍵分割:

1
ls -lh | awk '{print $5"t"$9}'

$0變數是指當前一行記錄,$1是指第一個域資料,$2指第二個域資料……以此類推。

print與printf

awk提供了print與printf兩種列印輸出的函數。

print的引數可以是變數、數值和字串。引數用逗號分割,字串必須用雙引號參照。

printf與C語言中的printf函數類似,可以用來格式化字串。

1
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%sn",FILENAME,NR,NF,$0)}' /etc/passwd

根據指定分隔符切割域

1
ll | awk -F 't' 'print $9'

BEGIN…END

1
ls -lh | awk 'BEGIN {print "sizetfilename"}  {print $5"t"$9} END {print "---end---"}'

BEGIN...END語句的執行流程是,awk命令讀入資料,然後從BEGIN語句開始,依次讀取每一行記錄,並列印相應的域,當所有記錄都處理後再執行END語句後的程式。也就是說BEGIN...END語句塊中的內容在讀取資料過程中會反復執行,直到資料讀取完成。

pattern正則匹配

下面的例子表示列印當前目錄下,所有以.bat字尾結尾的檔名列表:

1
ls -l | awk -F: '/.dat$/{print $9}'

awk內建變數

awk有許多內建變數用來設定環境變數資訊,這些變數都可以被改變。常用的內建變數和作用如下所示:

1
2
3
4
5
6
7
8
9
10
11
ARGC               命令列引數個數
ARGV               命令列引數排列
ENVIRON            支援佇列中系統環境變數的使用
FILENAME           awk瀏覽的檔名
FNR                瀏覽檔案的記錄數
FS                 設定輸入域分隔符,等價於命令列-F選項
NF                 瀏覽記錄的域的個數
NR                 已讀的記錄數
OFS                輸出域分隔符
ORS                輸出記錄分隔符
RS                 指定用來切片的分隔符

awk中的內建變數都是很有用處的,可以直接使用。比如上面講過的指定分隔符操作就可以用FS變數來代替:

1
ll | awk '{FS="t";} {print $9}'

下面會有很多實用awk內建變數的例子。

awk程式設計

定義變數和運算

awk可以自定義變數,並參與運算。

比如統計當前目錄下列出的檔案總大小,以M為單位顯示出來:

1
ls -l | awk 'BEGIN {size=0;} {size+=$5;} END {print "size is ", size}'

注意此統計沒有把資料夾下的所有檔案算在內。

自定義的變數有時候可以不用作初始化操作,不過正規起見,還是建議作初始化操作為好。

條件語句

awk中的條件語句跟C語言類似,宣告方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(expression){
  statement1;
  statement2;
}
if(expression){
  statement1;
} else {
  statement2;
}
if(expression1){
  statement1;
} else if (expression2) {
  statement2;
} else {
  statement3;
}

看下面例子,將第三列為12,第六列為0的行列印輸出:

1
awk 'BEGIN {FS="t"}{if($3==12 && $6==0) print $0} END' incoming_daily_20150223.dat

迴圈語句

awk中的迴圈語句同樣與C語言中的類似,支援while、do/while、for、break、continue關鍵字。

看下面的例子,輸出每行的行號和第一列的資料:

1
awk 'BEGIN {FS="t";} {data[NR] = $1} END {for(i=1; i<=NR; i++) print i"t"data[i]}' incoming_daily_20150223.dat

陣列

看下面例子,統計第六列每一個值出現的次數:

1
awk 'BEGIN {FS="t"}{count[$6]++} END {for(x in count) print x,count[x]}' incoming_daily_20150223.dat

Linux系統之文字格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm

AWK簡介及使用範例 http://www.linuxidc.com/Linux/2013-12/93519.htm

Linux awk文字分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm

Linux文字處理工具之awk  http://www.linuxidc.com/Linux/2015-01/111437.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文字分析工具-awk  http://www.linuxidc.com/Linux/2014-12/110939.htm

使用awk格式化輸出文字 http://www.linuxidc.com/Linux/2016-04/130193.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-08/134623.htm


IT145.com E-mail:sddin#qq.com