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
benson x 500 500  /home/benson
apache x 48 48 Apache /var/www
ntp x 38 38  /etc/ntp
*  [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
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
[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  \\两个写法效果相同
xfs x
benson x
apache x
[root@test05 tmp]# awk -F "[:?]" '{print $1,$2}' a   \\ []内定义多个分隔符来区分
xfs x
benson x
apache x
[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]# 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
xfs:x:43?:43:X Font Server:/etc/X11/fs:/sbin/nologin
[root@test05 tmp]# awk '{B[NR]=$0} END {for (i=1;i<=NR-2;i++) print B[i]}' /tmp/a
xfs:x:43?:43:X Font Server:/etc/X11/fs:/sbin/nologin
benson:x?500:500::/home/benson:/bin/bash
[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
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'