Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15531620
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2009-01-08 22:53:26

awk的一些简单的使用
awk的基本的格式,例如:
awk -F 分格符号 命令 文件
举例:
[liuqi@ljjk bash]$ cat /etc/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
nobody:x:99:99:Nobody:/:/sbin/nologin
rpm:x:37:37::/var/lib/rpm:/bin/bash
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/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
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
ljjk:x:500:500:lingjiujianke:/home/ljjk:/bin/bash
liuqi:x:501:501::/home/liuqi:/bin/bash
[liuqi@ljjk bash]$ awk -F : '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
gopher
ftp
nobody
rpm
vcsa
nscd
sshd
rpc
rpcuser
nfsnobody
mailnull
smmsp
pcap
xfs
ntp
gdm
ljjk
liuqi
[liuqi@ljjk bash]$
可以看到这个例子是以":"符号为分格符号的,$1的意思是第一列的内容,;同理,$3是第三列的内容,例如:
[liuqi@ljjk bash]$ awk -F : '{print $3}' /etc/passwd
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
99
37
69
28
74
32
29
65534
47
51
77
43
38
42
500
501
[liuqi@ljjk bash]$

如果想同时读取两列的内容,那就如下例:
[liuqi@ljjk bash]$ awk -F : '{print $3,$1}' /etc/passwd
0 root
1 bin
2 daemon
3 adm
4 lp
5 sync
6 shutdown
7 halt
8 mail
9 news
10 uucp
11 operator
12 games
13 gopher
14 ftp
99 nobody
37 rpm
69 vcsa
28 nscd
74 sshd
32 rpc
29 rpcuser
65534 nfsnobody
47 mailnull
51 smmsp
77 pcap
43 xfs
38 ntp
42 gdm
500 ljjk
501 liuqi
[liuqi@ljjk bash]$
这个时候看到的输出内容不够美观,可以使用转意符号输出,例如:
[liuqi@ljjk bash]$ awk -F : '{print $3,"\t",$1}' /etc/passwd
0        root
1        bin
2        daemon
3        adm
4        lp
5        sync
6        shutdown
7        halt
8        mail
9        news
10       uucp
11       operator
12       games
13       gopher
14       ftp
99       nobody
37       rpm
69       vcsa
28       nscd
74       sshd
32       rpc
29       rpcuser
65534    nfsnobody
47       mailnull
51       smmsp
77       pcap
43       xfs
38       ntp
42       gdm
500      ljjk
501      liuqi
[liuqi@ljjk bash]$
这样看起来会好受一点.
$1 $3等都知道了,但是$0有点不一样,就是全部输出,例如:
[liuqi@ljjk bash]$ awk -F : '{print $0}' /etc/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
nobody:x:99:99:Nobody:/:/sbin/nologin
rpm:x:37:37::/var/lib/rpm:/bin/bash
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/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
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
ljjk:x:500:500:lingjiujianke:/home/ljjk:/bin/bash
liuqi:x:501:501::/home/liuqi:/bin/bash
[liuqi@ljjk bash]$
;为了美观和方便还可以使用BEGIN  END模式,例如
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"}{print $1} ' /etc/passwd
username
------
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
gopher
ftp
nobody
rpm
vcsa
nscd
sshd
rpc
rpcuser
nfsnobody
mailnull
smmsp
pcap
xfs
ntp
gdm
ljjk
liuqi
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"}{print $1} END {print "-------\nend of file"}' /etc/passwd
username
------
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
gopher
ftp
nobody
rpm
vcsa
nscd
sshd
rpc
rpcuser
nfsnobody
mailnull
smmsp
pcap
xfs
ntp
gdm
ljjk
liuqi
-------
end of file
[liuqi@ljjk bash]$
Awk的条件操作,~是匹配,例如:
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($1 ~/ljjk/) print $1} END {print "-------\nend of file"}' /etc/passwd
username
------
ljjk
-------
end of file
[liuqi@ljjk bash]$
|  是或的意思
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($1 !~/ljjk|liuqi/) print $1} END {print "-------\nend of file"}' /etc/passwd
username
------
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
gopher
ftp
nobody
rpm
vcsa
nscd
sshd
rpc
rpcuser
nfsnobody
mailnull
smmsp
pcap
xfs
ntp
gdm
-------
end of file
[liuqi@ljjk bash]$
 
!~是不匹配的
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($1 !~/ljjk/)
print $1} END {print "-------\nend of file"}' /etc/passwd
username
------
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
gopher
ftp
nobody
rpm
vcsa
nscd
sshd
rpc
rpcuser
nfsnobody
mailnull
smmsp
pcap
xfs
ntp
gdm
liuqi
-------
end of file
[liuqi@ljjk bash]$
==是判断是否是相等,例如:
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($3==500) print $1} END {print "-------\nend of file"}' /etc/passwd
username
------
ljjk
-------
end of file
[liuqi@ljjk bash]$
根据参数之间作判断,例如第三个参数小于第四个参数:
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($3<$4) print
$1} END {print "-------\nend of file"}' /etc/passwd
username
------
adm
lp
mail
news
uucp
games
gopher
ftp
-------
end of file
[liuqi@ljjk bash]$

按照多条件查询,例如:
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($1=="ljjk"&&$3==501) print $1} END {print "-------\nend of file"}' /etc/passwd
username
------
-------
end of file
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($1=="ljjk"&&$3==500) print $1} END {print "-------\nend of file"}' /etc/passwd
username
------
ljjk
-------
end of file
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($1=="ljjk"||$3==501) print $1} END {print "-------\nend of file"}' /etc/passwd
username
------
ljjk
liuqi
-------
end of file
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($1=="ljjk"||$3==500) print $1} END {print "-------\nend of file"}' /etc/passwd
username
------
ljjk
-------
end of file
[liuqi@ljjk bash]$
awk 还有一些内置变量:
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分格符,等价于命令行F的选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分格符
ORS 输出记录分格符
RS 控制记录分格符
先举个简单的例子:
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($1=="ljjk"||$3==501) print $1,"\t\t", NR} END {print "-------\nend of file"}' /etc/passwd
username
------
ljjk             30
liuqi            31
-------
end of file
[liuqi@ljjk bash]$
这里的30和31是在文件中的30和31行,也就是读了30,31次记录
也可以重新付值一个域,例如:
[liuqi@ljjk bash]$ awk -F : 'BEGIN {print "username\n------"} {if ($1=="ljjk"||$3==501) name= $1; print $1,"\t\t", NR, "\t\t",name} END {print "-------\nend of
file"}' /etc/passwd
username
------
root             1
bin              2
daemon           3
adm              4
lp               5
sync             6
shutdown                 7
halt             8
mail             9
news             10
uucp             11
operator                 12
games            13
gopher           14
ftp              15
nobody           16
rpm              17
vcsa             18
nscd             19
sshd             20
rpc              21
rpcuser                  22
nfsnobody                23
mailnull                 24
smmsp            25
pcap             26
xfs              27
ntp              28
gdm              29
ljjk             30              ljjk
liuqi            31              liuqi
-------
end of file
[liuqi@ljjk bash]$
awk的内置的字符串函数:
gsub(r,s)  在整个$0中用s代替r
gsub(r,s,t)  在整个t中,用s代替r
index(s,t)  返回字符串s中的t的索引地址
length(s)  返回s的长度
match(s,r)  测试s是否包含匹配r的字符串
split(s,a,fs)  在fs上将s分成序列a
sprint(fmt,exp)  返回经fmt格式化后的exp
sub(r,s)  用$0的最左边最长的字符串代替s
substr(s,p)  返回字符串s中从p开始的后缀部分
substr(s,p,n)  返回字符串s从p开始的长度为n的后缀部分
awk还可以和管道一起使用,例如:
[liuqi@ljjk bash]$ df | awk '{print $1,"\t\t",$4}'
文件系统                 可用
/dev/hda1                1353736
none             62996
//192.168.5.89/linux             2787584
[liuqi@ljjk bash]$ awk -F : '{print $1,$3,$4,$6,$7}' /etc/passwd|grep ljjk
ljjk 500 500 /home/ljjk /bin/bash
[liuqi@ljjk bash]$
也可以man来查看awk的详细介绍
阅读(1873) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~