天天看點

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'