4月27日
參考資料: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有一個特殊的那就是
命令: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日