awk中让人郁闷的system()函数

所属分类: 脚本专栏 / linux shell 阅读数: 519
收藏 0 赞 0 分享

发现一个特尴尬的事实。我辛辛苦苦去百度资料,想用rewrite实现针对不同域名源站故障后的自动跳转功能,但整个思路里遗漏了一个严重的问题。

按我的思路,针对请求的url进行一次curl,然后根据http_code去改写url或者原样输出——这也就意味着,每一个请求,squid都回源去取一次header。那么对于源站来说,前面squid的缓存率,就是0%!完全没有效果。

得重新想过办法……难道去看squid源代码?汗

本着有头有尾善始善终的原则,决定还是把原先那个鸡肋想法写完。根据squid权威指南11章的说法,传递给重定向器的流格式为:URL IP/FQDN IDENT METHOD,其中FQDN和ident经常是空。METHOD,一般是GET和POST,squid只能缓存GET的数据,但不能无视POST方式,因为有时候POST数据header太大的话,squid可能拒绝转发这些内容,这就不好玩了。

在明确这个格式以后(主要是草草收尾的想法影响下),我便觉得其实完全不用perl或者php来搞,简单的awk就足够了——当然,shell不行,因为shell不能从事这种流状的行处理。

以下是本着我想法写的awk脚本:

复制代码 代码如下:

#!/bin/awk -f
{
  if(system("curl -o /dev/null -s -w %{http_code}" $1)~/^[2|3]/){
    print ":$1"
  } else {
    print ":http://www.baidu.com/"
  }
}

但是再度让我郁闷的事情接连发生。

第一,不管我在{}中进行什么操作,程序都把system()的结果print出来了;

第二,即使system()的结果是200,print出来的也是else{}的”http://www.baidu.com”;而如果我直接试验if(200~/^[2 3]/){}else{},结果就很正常!

试验过程如下:

复制代码 代码如下:

[rao@localhost ~]$ echo "http://www.google.com"|awk '{if(200~/^[2|3]/){ print ":"$1 } else{ print ":http://www.baidu.com/"}}'
:http://www.google.com
[rao@localhost ~]$ echo "http://www.google.com"|awk '{if(system("curl -o /dev/null -s -w %{http_code} "$1)~/^[2|3]/){print ":"$1 } else{ print ":http://www.baidu.com/"}}'
200:http://www.baidu.com/

思前想后,在百度大婶的帮助下,终于搞明白一个问题:system()的结果是直接返回给shell显示了,然后再由awk继续执行后面的程序,这种情况下,if()里留下的其实是system()的执行状态【即0或1】”0”~/^[2 3]/,当然就一直执行else了。

糟糕的问题是awk的getline,无法直接把system()的执行结果导入awk的变量…除非我先system里>一个文件,然后getline<这个文件。MyGod!

而如果采用while(“curl” getline var)的执行方式,如何传递shell变量进去又成了问题……唉

更多精彩内容其他人还在看

关于ssh连不上问题的解决方法(必看)

下面小编就为大家带来一篇关于ssh连不上问题的解决方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Ubuntu用户之间相互切换方法(推荐)

下面小编就为大家带来一篇Ubuntu用户之间相互切换方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Linux 编程之进程fork()详解及实例

这篇文章主要介绍了Linux 编程之进程fork()详解及实例的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

浅谈安装ORACLE时在Linux上设置内核参数的含义

下面小编就为大家带来一篇浅谈安装ORACLE时在Linux上设置内核参数的含义。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详谈linux中sar的使用方法

下面小编就为大家带来一篇详谈linux中sar的使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

设置Linux系统的空闲等待时间TMOUT的方法

下面小编就为大家带来一篇设置Linux系统的空闲等待时间TMOUT的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

关于Linux反空闲设置的两种方法总结

下面小编就为大家带来一篇关于Linux反空闲设置的两种方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

linux 查找大目录和大文件的方法(推荐)

下面小编就为大家带来一篇linux 查找大目录和大文件的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Linux makefile 和shell文件相互调用实例详解

这篇文章主要介绍了Linux makefile 和shell文件相互调用实例详解的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Windows与Linux共享文件夹互相访问

这篇文章主要介绍了 详解Windows与Linux共享文件夹互相访问的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多