广东技术师范学院后院社区's Archiver

lvdbing 发表于 2008-4-22 02:27

Awk各部分详解-重定向(14)

[align=left][color=black][size=10.5pt][font=Arial]●[/font]         [/size][/color][color=black][size=10.5pt]输出重定向[/size][/color][/align][align=left][color=black][size=10.5pt]    Awk[/size][/color][color=black][size=10.5pt]输出重定向到文件时,会用到[/size][/color][color=black][size=10.5pt]shell[/size][/color][color=black][size=10.5pt]的重定向操作符。重定向的目标文件名,必须用双括号括起来。如果使用的重定向操作符为[/size][/color][color=black][size=10.5pt]>[/size][/color][color=black][size=10.5pt],则文件被打开并清空。文件一旦被打开,就会保持打开状态直至显示关闭或[/size][/color][color=black][size=10.5pt]awk[/size][/color][color=black][size=10.5pt]程序终止。此后[/size][/color][color=black][size=10.5pt]print[/size][/color][color=black][size=10.5pt]语句的输出都将追加到文件尾部。符号[/size][/color][color=black][size=10.5pt]>>[/size][/color][color=black][size=10.5pt]也用于打开文件,但是是向文件追加内容。[/size][/color][/align][align=left][table=98%,#e6e6e6][tr][td=1,1,707][b][color=black][size=10.5pt]范例[/size][/color][/b][b][color=black][size=10.5pt] 3-25[/size][/color][/b]
[color=black][size=10.5pt][root@localhost script]# [b]awk[/b][b] -F ':' '$3 == 0 {print "Your UID is:"$3 > "test_file"}' passwd[/b][/size][/color]
[color=black][size=10.5pt][root@localhost script]# [b]ls[/b][/size][/color]
[color=black][size=10.5pt]passwd[/size][/color][color=black][size=10.5pt]
passwd_1
test_file[/size][/color]
[color=black][size=10.5pt][root@localhost script]# [b]cat test_file[/b][/size][/color]
[color=black][size=10.5pt]Your UID is:0[/size][/color]
[color=black][size=10.5pt]### [/size][/color][color=black][size=10.5pt]解析[/size][/color][color=black][size=10.5pt] ###[/size][/color]
[color=black][size=10.5pt]如果记录的第[/size][/color][color=black][size=10.5pt]3[/size][/color][color=black][size=10.5pt]字段的值等于[/size][/color][color=black][size=10.5pt]0[/size][/color][color=black][size=10.5pt],则打印字符串“[/size][/color][color=black][size=10.5pt]Your UID is:[/size][/color][color=black][size=10.5pt]”,然后输出第[/size][/color][color=black][size=10.5pt]3[/size][/color][color=black][size=10.5pt]字段的值到[/size][/color][color=black][size=10.5pt]test_file[/size][/color][color=black][size=10.5pt]文件中。[/size][/color]
[/td][/tr][/table][/align]
[align=left][color=black][size=10.5pt][font=Arial]●[/font]         [/size][/color][color=black][size=10.5pt]输入重定向[/size][/color][/align][align=left][color=black][size=10.5pt]    getline[/size][/color][color=black][size=10.5pt]函数用于从标准输入、管道或文件(非当前处理的文件)读取输入。[/size][/color][color=black][size=10.5pt]Getline[/size][/color][color=black][size=10.5pt]函数用于读取下一输入行,并且设置内置变量[/size][/color][color=black][size=10.5pt]NF[/size][/color][color=black][size=10.5pt]、[/size][/color][color=black][size=10.5pt]NR[/size][/color][color=black][size=10.5pt]和[/size][/color][color=black][size=10.5pt]FNR[/size][/color][color=black][size=10.5pt]。如果读到一条记录函数就返回[/size][/color][color=black][size=10.5pt]1[/size][/color][color=black][size=10.5pt],如果读到[/size][/color][color=black][size=10.5pt]EOF(end of file[/size][/color][color=black][size=10.5pt],文件末尾[/size][/color][color=black][size=10.5pt])[/size][/color][color=black][size=10.5pt]则返回[/size][/color][color=black][size=10.5pt]0[/size][/color][color=black][size=10.5pt]。如果发生错误,比如打开文件失败,则[/size][/color][color=black][size=10.5pt]getline[/size][/color][color=black][size=10.5pt]函数返回[/size][/color][color=black][size=10.5pt]-1[/size][/color][color=black][size=10.5pt]。[/size][/color][/align][align=left][table=98%,#e6e6e6][tr][td=1,1,707][b][color=black][size=10.5pt]范例[/size][/color][/b][b][color=black][size=10.5pt] 3-26[/size][/color][/b]
[color=black][size=10.5pt][root@localhost script]#[b] awk 'BEGIN{"id" | getline d; print d'} passwd[/b][/size][/color]
[color=black][size=10.5pt]uid[/size][/color][color=black][size=10.5pt]=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t[/size][/color]
[color=black][size=10.5pt]### [/size][/color][color=black][size=10.5pt]解析[/size][/color][color=black][size=10.5pt] ###[/size][/color]
[color=black][size=10.5pt]先执行[/size][/color][color=black][size=10.5pt]id[/size][/color][color=black][size=10.5pt]命令,将输出通过通道发给[/size][/color][color=black][size=10.5pt]getline[/size][/color][color=black][size=10.5pt]函数,再通过[/size][/color][color=black][size=10.5pt]getline[/size][/color][color=black][size=10.5pt]将传来的内容赋值给用户自定义的变量[/size][/color][color=black][size=10.5pt]d[/size][/color][color=black][size=10.5pt],然后打印[/size][/color][color=black][size=10.5pt]d[/size][/color][color=black][size=10.5pt]。[/size][/color]
[b][color=black][size=10.5pt]范例[/size][/color][/b][b][color=black][size=10.5pt] 3-27[/size][/color][/b]
[color=black][size=10.5pt][root@localhost script]# [b]awk[/b][b] 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}'[/b][/size][/color]
[color=black][size=10.5pt]3[/size][/color][color=black][size=10.5pt]月[/size][/color]
[color=black][size=10.5pt]### [/size][/color][color=black][size=10.5pt]解析[/size][/color][color=black][size=10.5pt] ###[/size][/color]
[color=black][size=10.5pt]先执行[/size][/color][color=black][size=10.5pt]date[/size][/color][color=black][size=10.5pt]命令,将输出通过管道发给[/size][/color][color=black][size=10.5pt]getline[/size][/color][color=black][size=10.5pt],接着,[/size][/color][color=black][size=10.5pt]getline[/size][/color][color=black][size=10.5pt]从管道读取输入,然后保存在用户自定义变量[/size][/color][color=black][size=10.5pt]d[/size][/color][color=black][size=10.5pt]中。[/size][/color][color=black][size=10.5pt]Split[/size][/color][color=black][size=10.5pt]函数从[/size][/color][color=black][size=10.5pt]d[/size][/color][color=black][size=10.5pt]中生成一个名为[/size][/color][color=black][size=10.5pt]mon[/size][/color][color=black][size=10.5pt]的数组。最后,程序打印出数组[/size][/color][color=black][size=10.5pt]mon[/size][/color][color=black][size=10.5pt]的第[/size][/color][color=black][size=10.5pt]2[/size][/color][color=black][size=10.5pt]个原数。[/size][/color]
[b][color=black][size=10.5pt]范例[/size][/color][/b][b][color=black][size=10.5pt] 3-28[/size][/color][/b]
[color=black][size=10.5pt][root@localhost script]#[b] awk 'BEGIN{while("ls" | getline)print}'[/b][/size][/color]
[color=black][size=10.5pt]passwd[/size][/color]
[color=black][size=10.5pt]passwd_1[/size][/color]
[color=black][size=10.5pt]test_file[/size][/color]
[color=black][size=10.5pt]### [/size][/color][color=black][size=10.5pt]解析[/size][/color][color=black][size=10.5pt] ###[/size][/color]
[color=black][size=10.5pt]ls[/size][/color][color=black][size=10.5pt]命令的输出将传递给[/size][/color][color=black][size=10.5pt]getline[/size][/color][color=black][size=10.5pt];每循环一次,[/size][/color][color=black][size=10.5pt]getline[/size][/color][color=black][size=10.5pt]就从[/size][/color][color=black][size=10.5pt]ls[/size][/color][color=black][size=10.5pt]的输出中读取一行,并将其显示到屏幕上。不需要输入文件,因为[/size][/color][color=black][size=10.5pt]awk[/size][/color][color=black][size=10.5pt]会在文件打开之前先处理完[/size][/color][color=black][size=10.5pt]BEGIN[/size][/color][color=black][size=10.5pt]块。[/size][/color]
[/td][/tr][/table][/align]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.