在对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~~