2016-06-22 31 views
0

,同時在HP-UX存儲遷移項目工作, 我發現了一個awk聲明如下awk中數組循環翻譯

ioscan -funNCdisk | \ 
awk '{a[NR]=$0} $0~s {f[NR]++} END {for (j=1;j<=NR;j++) if (f[j]) for (i=j+C;i<=j+C;i++) \ 
print a[i]}' C=1 s="NetApp" 

看來它打印出符合「NetApp公司」的直線和一些相關的多線該關鍵字。

任何人都可以幫我理解這句話的意思嗎?

謝謝

+0

如果你想學習'awk',有一些有用的鏈接:http://polymer.bu.edu/~fding/sedawk/index.htm http://www.gnu.org/software/gawk/ manual/gawk.html http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_toc.html – Jdamian

回答

2

讓我們擺脫這一awk腳本轉換本身就是一個文件,並調用該文件script.awk

#!/usr/bin/awk -f 

BEGIN { C = 1; s = "pants" } 
     { a[NR] = $0 } 
$0 ~ s { f[NR]++ } 
END  { 
    for (j = 1; j <= NR; j++) 
     if (f[j]) 
      for (i = j + C; i <= j + C; i++) 
       print a[i] 
} 
  1. 我增加了變數sC的初始化在BEGIN阻止,只是爲了我自己的便利而進行測試。你的腳本從命令行獲取這些信息。

  2. 添加最後一行的當前行a

  3. 如果該行包含字符串s(測試爲正則表達式),在對應於當前行索引 遞增陣列f(這是與在這種情況下f[NR] = 1)。

  4. 在輸入端:遍歷所有存儲的線,如果我們標記的f陣列中的行打印存儲的線,開始在標記線加C和繼續,呃,不,只是打印那條單線(bug在這裏?)。

因此,我們的腳本將打印每行匹配正則表達式s的行之後的每一行。

測試它:

$ cat data.in 
Hello world! 
My pants 
are on fire! 
No, hold on, 
Those are not *my* pants. 
Phew! 

$ chmod +x script.awk 

$ ./script.awk data.in 
are on fire! 
Phew! 

所以,你的情況(替換 「褲」 與 「NetApp的」 在這裏),這是幾乎相同(使用GNU sed

sed -n '/pants/,+1p' data.in | grep -v 'pants' 

grep -A1 'pants' data.in | grep -E -v 'pants|-' 

個人說明:這就是爲什麼我討厭所謂的「單線」。他們很醜,沒有人理解他們,他們完全無法維護。請,把複雜的任務放在一個腳本中,乾淨地寫下評論,然後用作爲你的「單線程」

編輯:經過一番思考,我意識到,thise腳本可能試圖實現grep -Cnum renum = Cre = s(獲得C行內容),但它在內環錯誤得到循環指數(應是i = j - C; i <= j + C)。

0

謝謝Kusalananda :)現在我的好奇心得到釋放! 你說得對,這個循環的範圍最初設計爲從j-c到j + c,但以某種方式修改,可能有人打算只找到一行,而不是幾行。