awk是一個強大的文本分析工具。相對grep sed awk顯得更屌炸。
[root@localhost pangbing]# awk -Wversion 或是awk --version
GNU Awk 3.1.7
Copyright (C) 1989, 1991-2009 Free SoftwareFoundation.
2.域和記錄
域的標記爲$1 $2 $3.....。這種方法稱爲域標識。
$0表示所有域 。例子:awk '{print $0}'文件名
例子:awk '{print $0}'文件名>文件名| tee文件名
管道前邊的結果會直接輸出到文件,不會輸出到屏幕上。tee命令就是能同時讓結果輸出到屏幕上。
打印不同的域,中間用逗號隔開 。
例子:'{print$1,$3,$7}'
3.awk匹配正則表達式
元字符: 這裏是a w k中正則表達式匹配操作中經常用到的字符:
\ ^ $ . [] [^] | () * +?
條件操作符
表9 - 2給出a w k條件操作符,後面將給出其用法。
表9-2 awk條件操作符
操 作 符 描 述 操 作 符 描 述
< 小於 >= 大於等於
<= 小於等於 ~ 匹配正則表達式
== 等於 !~ 不匹配正則表達式
!= 不等於
<1> 匹配
爲使某一域號匹配正則表達式,使用符號‘~’後緊跟正則表達式
例子:
awk /root/ /etc/passwd這個是簡單的寫法 ;passwd文件中只要含有root的行就打印出來
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
awk -F: '$1~/root/' /etc/passwd意思是以:
爲分隔符號,打印第一段(區域)匹配含有root的行
root:x:0:0:root:/root:/bin/bash
awk -F: '$3~/0/' /etc/passwd意思是以:爲分隔符號,打印第三段(區域)匹配含有0的行
awk -F: '$3=="0"' /etc/passwd意思是以:爲分隔符號,打印第三段(區域)匹配是0的行(這時精確匹配)
<2>. 精確匹配
爲精確匹配48,使用等號==,並用單引號括起條件。例如$3==“48”,這樣確保只有4 8
序號得以匹配,其餘則不行。
awk -F: '$3~/0/' /etc/passwd意思是以:爲分隔符號,打印第三段(區域)匹配含有0的行
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
pangbing:x:500:500:pangbing:/home/pangbing:/bin/bash
awk -F: '$3=="0"' /etc/passwd意思是以:爲分隔符號,打印第三段(區域)匹配只是0的行( 這是精確匹配)
################
root:x:0:0:root:/root:/bin/bash
awk '/^ /'文件名 匹配以空格開頭的行
awk '/^ | ^#/' httpd.conf匹配空格開頭的或者是^#開頭的
awk '!(/表達式1/ && /表達式2/)' /etc/passwd 表示取反
<3>不匹配
awk -F: '$3!="0"' /etc/passwd
awk -F: '$3!~/0/' /etc/passwd
<4>比較
awk -F: '$3>=$4' /etc/passwd
4.計算
[root@localhostpangbing]# cat 1
1 11
2 12
3 14
4 22
<1>求和
格式:awk '{變量名+=第幾列}END{print變量名}'文件名
[root@localhost pangbing]#awk '{sum+=$1}END{print sum}' 1
10
[root@localhostpangbing]#awk '{sum+=$2}END{print sum}' 1
59
<2>求平均值
格式:awk '{變量名+=第幾列}END{print變量名/NR}'文件名
[root@localhostpangbing]#awk '{a+=$2}END{print a/NR}' 1
14.75
5.多條件同時匹配
[root@localhost pangbing]# cat 1
1 11
1 12 asd fff
1 13 2
同時匹配多個條件
格式:awk '條件1&&條件2&&條件...'文件名
[root@localhostpangbing]# awk '$1~/1/ && $2~/12/' 1
awk'$1~"1" && $2~"12"' 1 //也可以用""代替
1 12 asd fff
<1>前提是用 ~ 匹配時可以用雙引號替換//,
<2>/表達式/單獨出現時,不要用雙引號替換,結果會有誤。