awk博大精深,隻是自己知道,用過的在這整理一下,以後還是會不斷的去更新,讓這個blog成為自己成長、工作的一個記錄本...... 屬組、函數
1、用awk輸出sshd到apache使用者之間的行
# awk '/sshd/,/apache/' /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
avahi-autoipd:x:100:104:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
benson:x:500:500::/home/benson:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
2、第3列是14的行 \\這個在debian下試驗不成功,centos下成功
# awk '$3==14' /tmp/pass
ftp x 14 50 FTP User /var/ftp
第一列是nobody的行
# awk '$1=="nobody"' /tmp/pass
nobody x 99 99 Nobody /
3、帶x的行列印出第1、2列
# awk '/x/ {print $1,$2}' pass \\此處的x為正行中第一個字段
# awk '/^(benson|apache)/ {print $1,$2}' k \\以benson|apache開頭的行列印第1,2列
4、列印第一列是benson的那一行的第1,3列
# awk '$1 ~/benson/ {print $1,$3}' pass \\此處的benson必須為第一列的字段,注意前面的~
# awk '$1 ~/^(benson|x)/ {print $1,$2}' k \\第1列是benson|x的行列印第1,2列
5、NR 檔案的記錄号,即行号全部列出
NF 域的個數,即一共幾列
$NF 最後一列
# awk '{print NR,NF,$NF}' k \\輸出pass檔案的行數,列數,最後一列的内容
1 5 /home/benson
2 6 /var/www
3 5 /etc/ntp
[root@test05 tmp]# cat k
benson x 500 500 /home/benson
apache x 48 48 Apache /var/www
ntp x 38 38 /etc/ntp
6、# cat k
* [root@test05 tmp]# awk '{print $1,$2,$3}' k \\預設按照空格分開來了,正常列印
benson x 500
apache x 48
ntp x 38
*[root@test05 tmp]# awk '{print $1$2$3}' k \\沒有逗号的卻别在于中間無空格分開
bensonx500
apachex48
ntpx38
* [root@test05 tmp]# awk '{print $1":"$2" "$3}' k \\自己添加分隔符,用雙引号隔開
benson:x 500
apache:x 48
ntp:x 38
7、非預設分隔符分隔
[root@test05 tmp]# cat a
[root@test05 tmp]# awk -F ":" '{print $1,$2}' a \\冒号就是定義的分隔符了
xfs x
benson x
apache x
[root@test05 tmp]# awk 'BEGIN {FS=":"}{print $1,$2}' a \\兩個寫法效果相同
[root@test05 tmp]# awk -F "[:?]" '{print $1,$2}' a \\ []内定義多個分隔符來區分
[root@test05 tmp]# cat a
xfs:x:43?:43:X Font Server:/etc/X11/fs:/sbin/nologin
benson:x?500:500::/home/benson:/bin/bash
apache:x?48:48:Apache:/var/www:/sbin/nologin
# awk 'BEGIN {OFS="?"}{print $1,$2}' k \\通過OFS定義輸出分隔符
benson?x
apache?x
ntp?x
8、awk求和計算,計算passwd檔案第三列數字的和
$ awk -F ":" '{sum+=$3} END{print sum}' /etc/passwd
awk '{sum+=$3;n++}; END {print sum/n}' file \\求平均
67109
9、删除檔案最後2行\\awk需要緩存整個檔案,是以如果是大檔案不推薦使用
[root@test05 tmp]# awk '{B[NR]=$0} END {for (i=1;i<=NR-2;i++) print B[i]}' /tmp/a
[root@test05 tmp]#
10、awk 第一列替換
[root@cstrike tmp]# cat a
86 tar xzvf nagios-plugins-1.4.15.tar.gz
87 cd nagios-plugins-1.4.15
88 ls
89 ./configure --with-nagios-user=nagios --with-nagios-group=nagios
90 make
91 make install
删除數字這一列
# awk '{$1="";print $0}' file \\将第1列指派為空,也可以設定為其他符号實驗。
11、在第一列前添加“‘ ”
# cat test.txt
zhangy
llccyd
hjh
a
# awk '{print "'\''","\t", $0}' test.txt
\\雙引号中間再加2個單引号,單引号中間再添加轉義的\'
#awk '{print "\047",$0}' test.txt \\作用相同
' zhangy
' llccyd
' hjh
' a
12、2列一行,awk實作
[root@demo2 tmp]# cat a
b
c
d
[root@demo2 tmp]# awk '{if (NR%2==0){print $0} else {printf"%s ",$0}}' a
a b
c d
13 每3行合并一行
awk '{printf(NR%3)?$0" ":$0"\n"}' sed 'N;N;s/\n//g'