讓我們擺脫這一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]
}
我增加了變數s
和C
的初始化在BEGIN
阻止,只是爲了我自己的便利而進行測試。你的腳本從命令行獲取這些信息。
添加最後一行的當前行a
。
如果該行包含字符串s
(測試爲正則表達式),在對應於當前行索引 遞增陣列f
(這是與在這種情況下f[NR] = 1
)。
在輸入端:遍歷所有存儲的線,如果我們標記的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 re
爲num = C
和re = s
(獲得C
行內容),但它在內環錯誤得到循環指數(應是i = j - C; i <= j + C
)。
如果你想學習'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