天天看点

awk学习笔记---更新中

       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'