淺嘗awk

前幾天寫了sed,這次來繼續學習一下它的好兄弟,awk,用了兩者,一個這樣的感覺,兩者都可以用來處理匹配,如果想對文本做處理,sed的刪除,匹配,替換要用的頻繁一些,如果要深入文本的每一行,對每一行進行一些列處理,例如,統計,然後格式化輸出,awk就可以派上用場了

查看自己ubuntu當前的awk

which awk,其實用的是/usr/bin/mawk


在學習sed篇中,我們知道,sed是讀取文本的每一行到一個模式空間,然後對模式空間的內容進行處理,其實awk差不多,它也是對模式空間進行處理,但是它做的處理動作時"切片"

1.awk的變量

爲什麼要先說變量呢,因爲不用變量,awk基本上就是廢(遊戲玩多了^-^)

首先我們把/etc/passwd裏面的第一行取出來備用

head -1 /etc/passwd > test.txt

$0  當前處理的記錄(默認是行,除非指定RS)

awk 'BEGIN{FS=":"}{print $0}' test.txt
root:x:0:0:root:/root:/bin/bash

$1---$n 當前的第幾個字段,和命令行參數類似

awk 'BEGIN{FS=":"}{print $1,$3}' test.txt

FS 這裏記住:F表示域field,S表示分隔seperate

這裏有兩種寫法:我喜歡用這種,簡潔明瞭

awk -F: '{print $1,$2,$3}' test.txt

RS 想想,R表示記錄record,S同上

awk 'BEGIN{RS=":"}{print $1,$3}' test.txt
NF number of field 可以理解爲多少列

awk 'BEGIN{FS=":"}{print NF}' test.txt

NR number of record 可以理解爲多少行

awk 'BEGIN{FS=":"}{print NR}' test.txt

OFS  FS是處理這行的時候的分隔,O是指輸出,OFS就是指輸出時候的分隔符

awk 'BEGIN{FS=":"}{print $1,$2,$3}' OFS="#" test.txt

ORS 同理


2.awk的格式化輸出

awk的處理完文本之後還可以按照格式化進行輸出,很強大吧,其實說白了就是printf

awk -F: '{printf "%s#%s#%s\n" ,$1,$2,$3}' test.txt
%d 十進制整數

%f 浮點數

%s 字符串

%% 百分號

- 左對齊

雖然簡單,但是靈活運用,效果特殊


3.awk的算術運算

awk支持的運算符:+ - * / % **  awk甚至提供了一些數學函數sin(x),cos(x)等

還可以做一些統計運算,統計某一列的值

awk '{ sum += $1 }; END { print sum }' file
awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}'

4.模式

awk '模式{命令}‘ file

模式可以是一下幾種:

1.正則表達式

awk -F : '/^r/{print $1}' /etc/passwd
2.表達式

awk -F: '$3>=500{print $1,$3}' /etc/passwd
awk -F: '$7 ~/bash$/{print $1,$7}' /etc/passwd
awk -F: '$7 !~/bash$/{print $1,$7}' /etc/passwd
3.BEGIN和END

BEGIN{ 這裏面放的是執行前的語句 }

END {這裏面放的是處理完所有的行後要執行的語句 }

{這裏面放的是處理每一行時要執行的語句}

例如:

awk 'BEGIN{test="123";print test}'
發現其實沒有文件也可以使用awk,因爲BEGIN不依賴於輸入,但是注意打印內部變量不必使用$



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章