当然可以使用管道将值传入a w k。本例使用w h o命令, w h o命令第一列包含注册用户名,
这里打印注册用户,并加入一定信息。 [iyunv@localhost ~]# who
root :0 2013-12-03 20:47
root pts/1 2013-12-03 20:48 (:0.0)
[iyunv@localhost ~]# who |awk '{print $1 "is logged on"}'
rootis logged on
rootis logged on
a w k也允许传入环境变量。下面的例子使用环境变量L O G N A M E支持当前用户名。可从
w h o命令管道输出到a w k中获得相应信息。
[iyunv@localhost ~]# who |awk '{if($1==user) print $1" you are connected to "$2}'user=$LOGNAME
可以将a w k脚本写入一个文件再执行它。命令不必很长(尽管这是写入一个脚本文件的主
要原因),甚至可以接受一行命令。这样可以保存a w k命令,以使不必每次使用时都需要重新
输入。使用文件的另一个好处是可以增加注释,以便于理解脚本的真正用途和功能。
使用前面的几个例子,将之转换成a w k可执行文件。像原来做的一样,将学生目前级别分
相加awk ‘(t o t + = $ 6) END{print "club student total points:" t o t }’ g r a d e . t x t。
创建新文件s t u d e n t t o t . a w k,给所有a w k程序加入a w k扩展名是一种好习惯,这样通过查
看文件名就知道这是一个a w k程序。文本如下:
第一行是! /bin/awk -f。这很重要,没有它自包含脚本将不能执行。这一行告之脚本系统
中a w k的位置。通过将命令分开,脚本可读性提高,还可以在命令之间加入注释。这里加入头
信息和结尾的平均值。基本上这是一个一行脚本文件。
[iyunv@localhost huangcd]# cat cat student_tot.awk
cat: cat: 没有那个文件或目录
#!/bin/awk -f
BEGIN{print "Student Date Member No. Grade Age Points Max"
print "Name Joined Gained Point Available"
print "=============================================================="
}
(tot+=$6)
END{print "Club student total points :"tot
}
[iyunv@localhost huangcd]# ./student_tot.awk grade.txt
Student Date Member No. Grade Age Points Max
Name Joined Gained Point Available
==============================================================
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
Club student total points :155
如果使用非空格符做域分隔符( F S)浏览文件,例如# 或:,编写这样的一行命令很容易,
因为使用F S选项可以在命令行中指定域分隔符。
使用a w k脚本时,记住设置F S变量是在B E G I N部分。如果不这样做, a w k将会发生混淆,
不知道域分隔符是什么。
下述脚本指定F S变量。脚本从/ e t c / p a s s w d文件中抽取第1和第5域,通过分号“;”分隔
p a s s w d文件域。第1域是帐号名,第5域是帐号所有者。
[iyunv@localhost huangcd]# cat passwd.awk
#!/bin/awk -f
BEGIN{
FS=":"}
{print $1,"\t",$5}
[iyunv@localhost huangcd]# ./passwd.awk /etc/passwd
root root
bin bin
daemon daemon
adm adm
lp lp
sync sync
shutdown shutdown
前面讲述s p l i t函数时,提到怎样使用它将元素划分进一个数组。这里还有一个例子:
[iyunv@localhost huangcd]# awk 'BEGIN {print split("123#456#789",myarray,"#")}'
3
在上面的例子中,s p l i t返回数组m y a r r a y下标数。实际上m y a r r a y数组为:
myarray[1] = "123" myarray[2]= "456" myarray[3]="789"
[iyunv@localhost huangcd]# cat arraytest.awk
#!/bin/awk -f
BEGIN{
record="123#456#789";
split(record,myarray,"#")}
END{for(i in myarray)
{print myarray}}
[iyunv@localhost huangcd]# ./arraytest.awk /dev/null
123
456
789
|