在awk中可以直接执行shell命令。
- zoer@ubuntu:~$ touch a
- zoer@ubuntu:~$ touch b
- zoer@ubuntu:~$ cat a.txt
- a
- b
- zoer@ubuntu:~$ awk '{cmd="rm "$0;system(cmd)}' a.txt
- zoer@ubuntu:~$ ls
- a.txt dd important mysql py testdata
- daemon.py Desktop installer mysql_install_db.sh stu
- data dfadsfadfadf jdk1.6.0_33 Public stu.txt
- zoer@ubuntu:~$
我们在awk中组装命令并且最后使用system()来执行。每次读入一个文件名并删除这个文件。
----------------------------------------
下面我们使用awk中执行命令来创建一些文件。
- zoer@ubuntu:~$ awk 'BEGIN{count=10;i=0;while(i<count){cmd="touch "i".txt";i++;system(cmd)}}'
- zoer@ubuntu:~$ ls
- 0.txt 4.txt 8.txt dd jdk1.6.0_33 py
- 1.txt 5.txt 9.txt Desktop mysql stu
- 2.txt 6.txt daemon.py important mysql_install_db.sh stu.txt
- 3.txt 7.txt data installer Public testdata
补充效率问题:
在对squid进行目录刷新的时候,一般使用的脚本都是采用for i in squidclient mgr:objects|grep $1|awk '{print $2}'
;do squidclient -m purge “$i”;done的方式。
mgr:objects本来就是一个比较费资源的请求,假如一个200G的cache,这个$i变量该卡多久才能有反应?抑或直接挂掉……
于是把这个稍微改进一下,变成squidclient mgr:objects | awk ‘/”‘$1’”/{system(“squidclient -m purge “$2)}’,因为awk对每行进行匹配后,就可以同时作出反应,所以比存一个大变量要好一些。 |
不过在使用中发现还有一些别的问题。比如碰到http://www.test.com/abc(123).html这样的url的时候,就会出错:
sh: -c: line 0: syntax error near unexpected token `(‘
url里的括号和awk函数的括号冲突了。所以对$2不能简单引用就完,还得处理。 CU上有人给出如下写法:
awk ‘{system(“squidclient -m purge ‘’’“$2”’’’”)}’
一试果然可以,试着分解一下这堆引号:
‘{system(“squidclient -m purge ‘第一部分,单引号表示里面的内容都传递给awk处理;
‘第二部分,shell环境下转义单引号为普通字符;
’“$2”‘第三部分,传递给awk,其中第一个”接第一部分的”,完成system函数的命令部分,其中包括了第二部分的普通字符’;
‘第四部分,shell环境下转义单引号为普通字符;
’”)}’第五部分,传递给awk,其中”接第三部分的第二个”,其中包含了第四部分的普通字符’;
合在一起,就给替换好的$2加上了一对’‘,然后通过system函数传递给shell执行。OK~~
getline:
先把文件列表存在filename文件中
先
awk '{system("rm $0")}' filename -------WRONG
因为对于 system来说 $0 不再是某行全部的内容,而是 “sh” , 上面的命令相当于执行“ sh rm sh”
然后
awk '{cmd="rm "$0;system(cmd)}' filename ----OK
下面的也ok
awk '{cmd="rm "$0;cmd|getline }' filename ---- OK
man awk里面关于getline的说明,大意是说 运行command,同时会把输出存在$0 里面,或参数var中。
command | getline [var]
Run command piping the output either into $0 or var, as above.
command |& getline [var]
Run command as a co-process piping the output either into $0 or var, as above.
Co-processes are a gawk extension.