天天看點

shell腳本工具之awk指令

    awk是一種優良的文本處理工具.可以對檔案中的内容一行一行提取并處理,也可将檔案分列的形式提取.

awk内置變量:

$0                --輸出檔案所有内容

$1-$n             --以分隔符輸出每列的值

FILENAME          --輸出檔案名

FS                --輸出字段的分隔符

NF                --目前記錄的字段數目

NR                --目前記錄的編号

OFS               --輸出字段的分隔符

ORS               --輸出記錄分隔符

RS                --控制記錄分隔符

檔案内容:

[root@tong1 opt]# cat passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@tong1 opt]#

1.awk指令格式

awk '{pattern + action}' {filenames}

2.内置變量執行個體

[root@tong1 opt]# awk -F: '{print "第一列值:"$1,"檔案名:"FILENAME,"每列共多少字段:"NF,"輸出每行編号:",NR,"輸出字段分隔符:"OFS}' passwd

第一列值:root 檔案名:passwd 每列共多少字段:7 輸出每行編号: 1 輸出字段分隔符: 

第一列值:bin 檔案名:passwd 每列共多少字段:7 輸出每行編号: 2 輸出字段分隔符: 

第一列值:daemon 檔案名:passwd 每列共多少字段:7 輸出每行編号: 3 輸出字段分隔符: 

第一列值:adm 檔案名:passwd 每列共多少字段:7 輸出每行編号: 4 輸出字段分隔符: 

第一列值:lp 檔案名:passwd 每列共多少字段:7 輸出每行編号: 5 輸出字段分隔符: 

第一列值:sync 檔案名:passwd 每列共多少字段:7 輸出每行編号: 6 輸出字段分隔符: 

第一列值:shutdown 檔案名:passwd 每列共多少字段:7 輸出每行編号: 7 輸出字段分隔符: 

第一列值:halt 檔案名:passwd 每列共多少字段:7 輸出每行編号: 8 輸出字段分隔符: 

第一列值:mail 檔案名:passwd 每列共多少字段:7 輸出每行編号: 9 輸出字段分隔符: 

第一列值:uucp 檔案名:passwd 每列共多少字段:7 輸出每行編号: 10 輸出字段分隔符: 

第一列值:operator 檔案名:passwd 每列共多少字段:7 輸出每行編号: 11 輸出字段分隔符: 

第一列值:games 檔案名:passwd 每列共多少字段:7 輸出每行編号: 12 輸出字段分隔符: 

第一列值:gopher 檔案名:passwd 每列共多少字段:7 輸出每行編号: 13 輸出字段分隔符: 

第一列值:ftp 檔案名:passwd 每列共多少字段:7 輸出每行編号: 14 輸出字段分隔符: 

3.用printf輸出格式

[root@tong1 opt]# awk -F: '{printf ("第一列值:%-10s,檔案名:%-10s,每列共多少字段:%-3s,輸出每行編号:%-3s,輸出字段分隔符:%10s\n",$1,FILENAME,NF,NR,OFS)}' passwd

第一列值:root      ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:1  ,輸出字段分隔符:          

第一列值:bin       ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:2  ,輸出字段分隔符:          

第一列值:daemon    ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:3  ,輸出字段分隔符:          

第一列值:adm       ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:4  ,輸出字段分隔符:          

第一列值:lp        ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:5  ,輸出字段分隔符:          

第一列值:sync      ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:6  ,輸出字段分隔符:          

第一列值:shutdown  ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:7  ,輸出字段分隔符:          

第一列值:halt      ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:8  ,輸出字段分隔符:          

第一列值:mail      ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:9  ,輸出字段分隔符:          

第一列值:uucp      ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:10 ,輸出字段分隔符:          

第一列值:operator  ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:11 ,輸出字段分隔符:          

第一列值:games     ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:12 ,輸出字段分隔符:          

第一列值:gopher    ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:13 ,輸出字段分隔符:          

第一列值:ftp       ,檔案名:passwd    ,每列共多少字段:7  ,輸出每行編号:14 ,輸出字段分隔符:          

4.列印特殊字元

[root@tong1 opt]# awk 'BEGIN {print "dsvjs"}'

dsvjs

[root@tong1 opt]# awk 'BEGIN {print "\"dsvjs\""}'     --列印"号

"dsvjs"

5.動态讀入内容

[root@tong1 opt]# awk '{print}'

qw er haogv 3

3 677

^C

6.查找檔案内容并輸出

[root@tong1 opt]# awk '/mail/ {print $0}' passwd

[root@tong1 opt]# awk '/root/ {print $0};/ftp/ {print $0}' passwd

7.在檔案中查找第三列的值大于10輸出

[root@tong1 opt]# awk -F":" '{ if ($3 > 10) print $1}' passwd

operator

games

gopher

ftp

8.輸出檔案第10行以後的資料

[root@tong1 opt]# awk 'NR>10' passwd

正規表達式

^         --以某字元開頭

~         --等于某字元

\         --轉義特殊字元

$         --以某字元結尾

.         --任意一個字元

[...]     --比對方括号任意字元

[^..]     --不比對方括号任意字元

|         --或

*         --所有字元

+         --連續字元

?         --單個字元

{n}       --字元出現n次

{n,}      --字元出現n次以上

{n,m}     --字元出現n到m次之間

9.使用正規表達式

[root@tong1 opt]# awk '$1 ~ /root/ {print}' passwd

[root@tong1 opt]# 

10.以r開頭,中斷隻有兩個字元的内容

[root@tong1 opt]# awk '$1 ~ /^r..t/ {print}' passwd

11.計算$3的值,符合條件輸出(OFS  指定輸出格式)

[root@tong1 opt]# awk -F: 'BEGIN {OFS=":"};{$3=$3-5;if($3>3) print $1,NR}' passwd

uucp:10

operator:11

games:12

gopher:13

ftp:14

12.統計檔案中的内容

[root@tong1 opt]# cat 4.sh 

$1 ~ /^root/ 

BEGIN {

   FS=":";OFS=""

}

{

   for (i=0;i<NF;i++) {

       print "使用者名:",$1

       print "密碼:",$2

       print "UID:",$3

       print "GID",$4

   }

END{}

[root@tong1 opt]# awk -f 4.sh  passwd

13.提取内容寫入到新檔案中

[root@tong1 opt]# awk -F: '{print $1 > "1.txt"} {print $4 > "2.txt"}' passwd

[root@tong1 opt]# cat 1.txt 

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

uucp

[root@tong1 opt]# cat 2.txt 

1

2

4

7

12

14

100

30

50

本文轉自 z597011036 51CTO部落格,原文連結:http://blog.51cto.com/tongcheng/1623289,如需轉載請自行聯系原作者