2017-06-20 269 views
0

我用AWK腳本創建了一個Bash腳本來讀取網絡ping文件,然後計算TCP協議獲取的參數如超時和估計的RTT。「awk fatal無法打開文件進行讀取(沒有這樣的文件或目錄)」在for循環bash腳本中

我將它插入到for循環中以讀取文件夾中的所有文件,但會引發無法讀取的錯誤。這裏是代碼:

for f in *.txt 
do awk ' 
function abs(v) {return v < 0 ? -v : v} 

BEGIN { 
    alpha=0.125; 
    beta=0.25; 
} 

FNR == 1 { 
    sampleRTT=$1; 
    estimatedRTT=SampleRTT; 
    devRTT=0.0000; 
    timeoutInterval=EstimatedRTT; 
    printf("%f\t%f\t%f\n", sampleRTT, estimatedRTT, timeoutInterval)} 

FNR > 1{ 
    sampleRTT=$1 
    estimatedRTT=((1-alpha)*estimatedRTT)+(alpha*sampleRTT); 
    devRTT=((1-beta)*devRTT)+(beta*(abs(sampleRTT-estimatedRTT))); 
    timeoutInterval=estimatedRTT+(4*devRTT); 
    printf("%f\t%f\t%f\n", sampleRTT, estimatedRTT, timeoutInterval)}' %f 
done 

我試過使用$ f,'$ f'和「$ f」。沒有作品。只需一次讀取單個文件即可。我沒有刪除這些文件,也沒有在另一個文件夾中運行該腳本。

+1

嘗試用雙引號括住'$ f':'「$ f」' –

+0

Alredy嘗試過。不起作用。 – MasterGeekMX

+0

它必須!嘗試在'awk'之前添加'echo'$ f「;'... –

回答

1

如果你只是想處理所有.txt文件與AWK,你可以這樣做:

awk '...' *.txt 

,你不需要for循環。


關於你提出的變量f選項:

  • %f:顯然不起作用,因爲%是不是一個Bash的運營商所有,而你從字面上傳遞%f作爲文件名AWK
  • '$f':顯然不起作用,因爲單引號會阻止變量替換,而你字面上通過$f作爲文件名AWK
  • $f工作,如果文件名包含沒有空格字符,沒有通配符字符(如*?),和沒有其它可膨脹字符(如~)。一般情況下,請儘量避免取消引用變量而不用雙引號括起來。
  • "$f"作品在任何情況下,是唯一正確途徑取消引用(即獲得的值)的變量

所以,你應該在你的for循環使用"$f",如果仍然不起作用,錯誤必須在其他地方。


如果錯誤信息是:

awk: fatal: cannot open file `*.txt' for reading (No such file or directory) 

那麼你有沒有.txt文件在當前目錄和Bash使用*.txt傳遞給AWK的文件名。

您可以通過啓用水珠擴展驗證防止這個共同的問題:

shopt -s nullglob 

在這種情況下,如果沒有匹配的水珠*.txt文件,然後擊不傳遞任何向AWK。

+1

@EdMorton我關注的是原則上可以使腳本工作的選項,但我完全同意,在解引用時,變量應該總是用雙引號括起來(除非在一些罕見的特殊情況下引用可能實際上會干擾預期的行爲)。我相應地編輯了我的答案。 – weibeld

相關問題