1. 程式人生 > >4月27日

4月27日

linux

awk也是流式編輯器,針對文檔中的行來操作,一行一行地執行,awk兼具sed的所有功能,而且更加強大,awk工具其實是很復雜的(有專門的書來介紹它的應用,有興趣的話自己可以去深入了解)。

參考資料:http://www.linuxidc.com/Linux/2014-12/110939.htm

1.、截取文檔中的某個段

命令: head -n2 passwd | awk -F ':' '{print $1}'

技術分享圖片

技術分享圖片

-F 選項的作用是指定分隔符,如果不加-F指定,則以空格或者tab為分隔符。 Print為打印的動作,用來打印出某個字段。1為第一個字段,2為第二個字段,依次類推,

1.1有一個特殊的那就是

$0,它表示整行

命令:head -n2 passwd | awk -F ':' '{print $0}'

技術分享圖片

1.2 註意awk的格式,-F後緊跟單引號,然後裏面為分隔符,print的動作要用 { } 括起來,否則會報錯。print還可以打印自定義的內容,但是自定義的內容要用雙引號括起來

命令: head -n2 passwd | awk -F ':' '{print $1"#"$2"#"$3"#"}'

技術分享圖片

2. 匹配字符或者字符串

命令:awk '/oo/' passwd

技術分享圖片

這跟sed的用法類似,能實現grep的功能,但沒有顏色顯示,肯定沒有grep用起來方便

2.1不過awk還有比sed更強大的匹配,某個段去匹配,這裏的’~’就是匹配的意思

命令:awk -F ':' '$1 ~/oo/' passwd

技術分享圖片

2.2 awk還可以多次匹配

命令:awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3,$4}' passwd

技術分享圖片

上例中awk匹配完root,再匹配user,它還可以只打印所匹配的段

2.4 awk也支持正則表達式

技術分享圖片

3. 條件操作符

命令:awk -F ':' '$3==0' passwd

技術分享圖片

awk中是可以用邏輯符號判斷的,比如 ‘==’ 就是等於,也可以理解為 ‘精確匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得註意的是,在和數字比較時,若把比較的數字用雙引號引起來後,那麽awk不會認為是數字,而認為是字符,不加雙引號則認為是數字.

3.1 給數字加上雙引號,命令:awk -F ':' '$3>="500"' passwd

技術分享圖片

上面的例子中,本想把uid大於等於500的行打印出,但是結果並不是我們的預期,這是因為awk把所有的數字當作字符來對待了。

3.2上一章中提到的sort排序原理一樣,但如果不加雙引號就得到了想要的結果

命令:awk -F ':' '$3>=500' passwd

技術分享圖片

3.3 !=表示不匹配,它除了針對某一個段的字符進行邏輯比較外,還可以在兩個段之前進行邏輯比較,命令:awk -F ':' '$7!="/sbin/nologin"' passwd

技術分享圖片

3.4 兩個段之間進行邏輯比較

命令:awk -F ':' '$3<$4' passwd

技術分享圖片

3.5 還可以使用&&(並且)和||(或者),它們分別表示:“並且”和“或者”

3.5.1&&的用法,命令:awk -F ':' '$3>"5" && $3<"7"' passwd

技術分享圖片

3.5.2 ||(或者)的用法,命令:awk -F ':' '$3>"5" || $7=="/bin/bash"' passwd

技術分享圖片

4、awk的內置變量,awk常用的變量有OFS、NF、NR,

OFS 和-F選項有類似的功能,也是和來定義分隔符的,但是它是在輸出的時候定義

NF 表示用分隔符分隔後一共有多少段,

NR 表示行號

4.1 OFS用法,命令:awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' passwd

技術分享圖片

4.2 NF 用法,命令:awk -F ':' '{print NF":"$0}' passwd

技術分享圖片

4.3 NR的用法,表示多少行,命令:awk -F ':' '{print NR":"$0}' passwd

技術分享圖片

4.3.1 使用NR作為判斷條件

命令:awk 'NR>20' passwd

技術分享圖片

4.3.2 可以配合段匹配一起使用:

命令: awk -F ‘:’ ‘NR<20 && $1 ~ /roo/’ /etc/passwd

技術分享圖片

5。 awk中的數學運算

5.1 awk可以更改 段值

命令:head -n 3 passwd | awk -F ':' '$1="root"'

技術分享圖片

5.2 對各個段的值進行數學運算

命令:head -n3 /etc/passwd |awk -F ':' '{$7=$4+$3; print $0}'

技術分享圖片

5.3 計算某個段總和

命令:awk -F ':' '{(tot=tot+$3)};END{print tot}' passwd

技術分享圖片

這裏的END要註意一下,表示所有的行都已經執行,這是awk特有的語法,其實awk連同sed都可以寫成一個腳本文件,而且有他們特有的語法,在awk中使用if判斷、for循環都是可以的。


4月27日