awk的内置函数不多,除去数学和字符串的都归到其他类了。如下表:
函数 | 说明 |
close( Expression ) | 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。 |
system(Command ) | 执行 Command 参数指定的命令,并返回退出状态。等同于system子例程。 |
Expression | getline [ Variable ] | 从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用popen子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 |
getline [ Variable ] < Expression | 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 |
getline [ Variable ] | 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。 |
下面举例说明:
1.close
该函数用于关闭输入输出文件,下面看两个例子,注意区别:
1)这是不带close的例子
先执行:
- sudo awk 'BEGIN{"date"|getline;print $1 > "date.txt";"echo abc"|getline;print $0 > "date.txt"}'
再执行:
- cat date.txt
输出:
- 2012年11月
- abc
说明:
由于没有关闭之前的date.txt文件,后面的内容会追加写入到date.txt中。
2)带有close的例子
先执行:
- sudo awk 'BEGIN{"date"|getline;print $1 > "date.txt";close("date.txt");"echo abc"|getline;print $0 > "date.txt"}'
再执行:
- cat date.txt
输出:
- abc
说明:
由于中间关闭了文件,后一次写入就覆盖了前一次写入的内容。
2.system
该函数用于执行系统命令
- awk 'BEGIN{b=system("date");print b;}'
输出:
- 2012年11月 8日 星期四 11时09分35秒 CST
- 0
说明:
上面输出的第一行是date命令的执行结果,第二行是system的执行结果
3.getline
该函数用于输入。有三种用法:
1)通过管道符输入
- awk 'BEGIN{"date"|getline var;print var;}'
输出:
- 2012年11月 8日 星期四 11时13分07秒 CST
说明:
上面的程序指定了一个变量var来存放getline的结果,如果没有指定,将默认为$0。如下:
- awk 'BEGIN{"date"|getline;print $0;}'
输出:
- 2012年11月 8日 星期四 11时19分02秒 CST
当然,如果是要输出某一列,可以用$n,如果是输出整行,$0也是可以省略的。
2)通过文件流输入
- awk 'BEGIN{while(getline < "address.dat"){print $0;};close("address.dat")}'
输出:
- 张三
- 13512345678
- zhangsan@163.com
- 新浪
- 李四
- 13811111111
- lisi@google.com
- 百度
说明:
getline从文件流中读取每一行并输出。
3)从命令行输入
- awk 'BEGIN{print "Enter your name:";getline name;print name;}'
输出:
- Enter your name:
- dddd
- dddd
说明:
第二行是用户的输入,第三行是程序的执行输出。getline接收了当前用户的输入,并在其后输出。
总结:
至此,awk的学习笔记算是结束了,对于表格类的数据,如日志,csv等,用awk可以很方便的处理。目前用得比较多的是将excel导出的数据用awk整理成sql再通过命令行导入到库,在数据量较大时,这种处理会比直接导入excel要快得多。顺便说一下,学习完一门技术如果不用很快就会忘记的,多用才是王道,共勉。
本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1053682,如需转载请自行联系原作者