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

 更新时间:2013年03月02日 19:45:52   作者:  
system()的结果是直接返回给shell显示了,然后再由awk继续执行后面的程序,这种情况下,if()里留下的其实是system()的执行状态【即0或1】”0”~/^[2 3]/,当然就一直执行else了

发现一个特尴尬的事实。我辛辛苦苦去百度资料,想用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变量进去又成了问题……唉

相关文章

  • Linux查看端口占用情况的常用命令

    Linux查看端口占用情况的常用命令

    这篇文章主要给大家介绍了Linux查看端口占用情况的常用命令,lsof命令,netstat命令,ss命令,fuser命令,ps命令以及proc文件系统这几种常用命令,感兴趣的小伙伴跟着小编一起来看看吧
    2023-11-11
  • shell中使用echo打印彩色字体和彩色背景的方法

    shell中使用echo打印彩色字体和彩色背景的方法

    这篇文章主要介绍了shell中使用echo打印彩色字体和彩色背景的方法,本文方法比较好玩,需要的朋友可以参考下
    2014-12-12
  • Linux命令之free命令使用详解

    Linux命令之free命令使用详解

    在Linux系统中,free命令用于显示系统内存的使用情况,它提供了系统内存总量、已使用内存、空闲内存以及其他与内存相关的统计信息,本文将给大家详细的介绍一下Linux free命令的使用方法,需要的朋友可以参考下
    2023-08-08
  • Linux压缩和解压命令大全之tar、gzip和zip详细教程

    Linux压缩和解压命令大全之tar、gzip和zip详细教程

    本文介绍了常用的压缩和解压命令,包括tar、gzip和zip,通过使用这些命令,我们可以方便地对文件和目录进行压缩和解压操作,从而节省存储空间和提高传输效率,需要的朋友可以参考下
    2023-09-09
  • 5个实用的shell脚本面试题和答案

    5个实用的shell脚本面试题和答案

    这篇文章主要介绍了5个实用的shell脚本面试题和答案,给出的脚本堪称编码规范,麻雀虽小,异常处理,友好提示,一应俱全,值得学习,需要的朋友可以参考下
    2014-06-06
  • shell之定时周期性执行脚本的方法示例

    shell之定时周期性执行脚本的方法示例

    这篇文章主要介绍了shell之定时周期性执行脚本的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • linux使用update-alternatives切换java版本

    linux使用update-alternatives切换java版本

    这篇文章主要介绍了linux使用update-alternatives切换java版本的相关资料,需要的朋友可以参考下
    2017-04-04
  • 用shell脚本防ssh和vsftpd暴力破解的详解讲解

    用shell脚本防ssh和vsftpd暴力破解的详解讲解

    新近刚上的FTP备份服务器,例行检查/var/log/secure日志时,发现不少sshd和vsftpd失败认证信息,很明显有人想用暴力破解工具窃取密码,所以需要编写一个安全脚本防止
    2014-01-01
  • Bash Shell中的select命令简单使用示例

    Bash Shell中的select命令简单使用示例

    这篇文章主要介绍了Bash Shell中的select命令简单使用示例,通常用于流程控制功能的实现,需要的朋友可以参考下
    2015-07-07
  • Linux 中makefile的命令包定义及使用

    Linux 中makefile的命令包定义及使用

    这篇文章主要介绍了Linux 中makefile的命令包定义及使用的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论