shell awk入門

來源:互聯網
上載者:User

標籤:

本文參考自 http://www.cnblogs.com/zhuyp1015/archive/2012/07/11/2586985.html

awk:好用的資料處理工具

 

awk 也是一個非常棒的資料處理工具!sed 常常用於一整個行的處理, awk 則比較傾向於一行當中分成數個『欄位』(或者稱為一個域,也就是一列)來處理。因此,awk 相當的適合處理小型的資料資料處理呢!awk 通常啟動並執行模式是這樣的:

[[email protected] ~]# awk ‘條件類型1{動作1}  條件類型2{動作2} ...‘  filename

 

awk 後面接兩個單引號並加上大括弧 {} 來配置想要對資料進行的處理動作。 awk 可以處理後續接的檔案,也可以讀取來自前個命令的 standard output 。 但如前面說的, awk 主要是處理『每一行的欄位內的資料』,而預設的『欄位的分隔字元號為 "空白鍵" 或 "[tab]鍵" 』!以下面這個文本為例子,用head將資料顯示出來。

文本名字:log

apple 6 30

pear 5 25

waterlemon 10 2

orange 2 100

若我想要取出水果的名字(第一列)與水果的單價(第三列)  ,且 名字 與 單價 之間以 ":" 隔開,則會變成這樣:

$ head log | awk ‘{print $1 ":" $3}‘ 

apple:30

pear:25

waterlemon:2

orange:100

上表是 awk 最常使用的動作!透過 print 的功能將欄位元據列出來!欄位的分隔則以空白鍵(預設)或 ":" 符號(指定)來隔開。 因為不論哪一行我都要處理,因此,就不需要有 "條件類型" 的限制!

另外,由上面這個例子你也會知道,在每一行的每個欄位都是有變數名稱的,那就是 $1, $2... 等變數名稱。以上面的例子來說, 水果名稱 是 $1 ,因為它是第一欄!至於  單價 是第三欄, 所以他就是 $3 啦!後面以此類推!還有個變數喔!那就是 $0 ,$0 代表『一整列資料』的意思~以上面的例子來說,第一行的 $0 代表的就是『apple .... 』那一行啊! 由此可知,剛剛上面四行當中,整個 awk 的處理流程是:

 

  1. 讀入第一行,並將第一行的資料填入 $0, $1, $2.... 等變數當中;
  2. 依據 "條件類型" 的限制,判斷是否需要進行後面的 "動作";
  3. 做完所有的動作與條件類型;
  4. 若還有後續的『行』的資料,則重複上面 1~3 的步驟,直到所有的資料都讀完為止。

 

經過這樣的步驟,你會曉得, awk 是『以行為一次處理的單位』, 而『以欄位為最小的處理單位』。好了,那麼 awk 怎麼知道我到底這個資料有幾行?有幾欄呢?這就需要 awk 的內建變數的幫忙啦。

 

變數名稱 代表意義
NF 每一行 ($0) 擁有的欄位總數
NR 目前 awk 所處理的是『第幾行』資料
FS 目前的分隔位元組,預設是空白鍵

我們繼續以上面head log 的例子來做說明,如果我想要:

  • 列出每一行的水果名稱(就是 $1);
  • 列出目前處理的行數(就是 awk 內的 NR 變數)
  • 並且說明,該行有多少欄位(就是 awk 內的 NF 變數)

Tips:
  要注意喔,awk 後續的所有動作是以單引號『 ‘ 』括住的,由於單引號與雙引號都必須是成對的, 所以, awk 的格式內容如果想要以 print 列印時,記得非變數的文字部分,包含上一小節 printf 提到的格式中,都需要使用雙引號來定義出來喔!因為單引號已經是 awk 的命令固定用法了!

則可以這樣:

head log | awk ‘{print $1 " lines:" NR " coloums:" NF }‘
apple lines:1 coloums:3
pear lines:2 coloums:3
waterlemon lines:3 coloums:3
orange lines:4 coloums:3

 # 注意喔,在 awk 內的 NR, NF 等變數要用大寫,且不需要有錢字型大小 $ 啦!

 

這樣可以瞭解 NR 與 NF 的差別了吧?好了,底下來談一談所謂的 "條件類型" 了吧!

註:$0 表示整行,$1 代表第一項

 

 

awk 的邏輯運算位元組

既然有需要用到 "條件" 的類別,自然就需要一些邏輯運算,例如下面這些:

運算單元 代表意義
> 大於
< 小於
>= 大於或等於
<= 小於或等於
== 等於
!= 不等於

值得注意的是那個『 == 』的符號,因為:

  • 邏輯運算上面亦即所謂的大於、小於、等於等判斷式上面,習慣上是以『 == 』來表示;
  • 如果是直接給予一個值,例如變數配置時,就直接使用 = 而已。

好了,我們實際來運用一下邏輯判斷吧!還是以上面log檔案作為例子,但是欄位之間用冒號分隔。那假設我要查閱,第三欄(數量)小於 29 以下的資料,並且僅列出水果名稱與第三欄,以冒號隔開,那麼可以這樣做:

 

$ head log | awk ‘{FS=":"} $3<29 {print $1 " : " $3}‘
apple:6:30 :
pear : 25
waterlemon : 2

不過,怎麼第一行也顯示出來呢?而且格式也不對。這是因為我們讀入第一行的時候,那些變數 $1, $2... 預設還是以空白鍵為分隔的,所以雖然我們定義了 FS=":" 了, 但是卻僅能在第二行後才開始生效。那麼怎麼辦呢?我們可以預先配置 awk 的變數啊! 利用 BEGIN 這個關鍵字喔!這樣做:

$ head log | awk ‘BEGIN {FS=":"} $3<29 {print $1 " : " $3}‘
pear : 25
waterlemon : 2

 而除了 BEGIN 之外,我們還有 END 呢!另外,如果要用 awk 來進行『計算功能』呢?以底下的例子來看, 假設我有一個薪資資料表檔名為 pay ,內容是這樣的:

如何幫我計算每個人的總額呢?而且我還想要格式化輸出喔!我們可以這樣考慮:

  • 第一行只是說明,所以第一行不要進行加總 (NR==1 時處理);
  • 第二行以後就會有加總的情況出現 (NR>=2 以後處理)

$ cat pay | \
> awk ‘NR==1 {printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" }
> NR>=2 {total= $2 + $3 + $4
> printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}‘


me 1st 2nd 3th Total
VBird 23000 24000 25000 72000.00
DMTsai 21000 20000 23000 64000.00
Bird2 43000 42000 41000 126000.00

 

上面的例子有幾個重要事項應該要先說明的:

  • awk 的命令間隔:所有 awk 的動作,亦即在 {} 內的動作,如果有需要多個命令輔助時,可利用分號『;』間隔, 或者直接以 [Enter] 按鍵來隔開每個命令,例如上面的範例中。
  • 邏輯運算當中,如果是『等於』的情況,則務必使用兩個等號『==』!
  • 格式化輸出時,在 printf 的格式配置當中,務必加上 \n ,才能進行分行!
  • 與 bash shell 的變數不同,在 awk 當中,變數可以直接使用,不需加上 $ 符號。

 

利用 awk 這個玩意兒,就可以幫我們處理很多日常工作了呢!真是好用的很~ 此外, awk 的輸出格式當中,常常會以 printf 來輔助,所以, 最好你對 printf 也稍微熟悉一下比較好啦!另外, awk 的動作內 {} 也是支援 if (條件) 的喔! 舉例來說,上面的命令可以修訂成為這樣:

# cat pay | > awk ‘{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}NR>=2{total = $2 + $3 + $4printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}‘

你可以仔細的比對一下上面兩個輸入有啥不同~從中去瞭解兩種文法吧!我個人是比較傾向於使用第一種文法, 因為會比較有統一性啊!

 

附:出自鳥哥的私房菜:第十二章、正規標記法與檔案格式化處理

 

 

shell awk入門

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.