awk中讓人鬱悶的system()函數_linux shell

來源:互聯網
上載者:User

發現一個特尷尬的事實。我辛辛苦苦去百度資料,想用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變數進去又成了問題……唉

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.