关闭

awk内部调用shell命令 -- shell

2657人阅读 评论(0) 收藏 举报
分类:

在awk中可以直接执行shell命令。

[plain] view plaincopy
  1. zoer@ubuntu:~$ touch a  
  2. zoer@ubuntu:~$ touch b  
  3. zoer@ubuntu:~$ cat a.txt   
  4. a  
  5. b  
  6. zoer@ubuntu:~$ awk '{cmd="rm "$0;system(cmd)}' a.txt   
  7. zoer@ubuntu:~$ ls  
  8. a.txt      dd            important    mysql                py       testdata  
  9. daemon.py  Desktop       installer    mysql_install_db.sh  stu  
  10. data       dfadsfadfadf  jdk1.6.0_33  Public               stu.txt  
  11. zoer@ubuntu:~$   

我们在awk中组装命令并且最后使用system()来执行。每次读入一个文件名并删除这个文件。

----------------------------------------

下面我们使用awk中执行命令来创建一些文件。

[plain] view plaincopy
  1. zoer@ubuntu:~$ awk 'BEGIN{count=10;i=0;while(i<count){cmd="touch "i".txt";i++;system(cmd)}}'  
  2. zoer@ubuntu:~$ ls  
  3. 0.txt  4.txt  8.txt      dd         jdk1.6.0_33          py  
  4. 1.txt  5.txt  9.txt      Desktop    mysql                stu  
  5. 2.txt  6.txt  daemon.py  important  mysql_install_db.sh  stu.txt  
  6. 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.



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:368931次
    • 积分:4645
    • 等级:
    • 排名:第6299名
    • 原创:170篇
    • 转载:193篇
    • 译文:0篇
    • 评论:5条
    最新评论