是否有任何實用程式可用於查找文本,例如在grep
(linux)或findstr
(dos)中,但僅在找到另一個給定文本/模式後才開始查找?
就像嘗試在文件中尋找給定的文字/模式一樣,但僅限於文件特定部分內的文字/模式。在我的例子中,只有“文件”是另一個程式的輸出,並且輸出的行數太多,無法寫入文件並在那裡進行分析。
例子:
section ONE
text_a
text_b
text_c
section TWO
text_b
text_c
section THREE
. . .
僅查找第二部分中是否有“text_c”。
我嘗試閱讀grep
的選項,但它似乎沒有這種能力。由於「text_c」比節名稱長得多,因此預計這也會最大限度地減少字串比較的數量。
答案1
讓我們考慮這個測試文件:
$ cat file
section ONE
text_a
text_b
text_c <-ignore this
section TWO
text_b
text_c <-keep this
section THREE
text_a
text_b
text_c <-ignore this
若要選擇包含text_c
以下內容的任何行section TWO
:
$ awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/' file
text_c <-keep this
如果輸入不是從檔案生成而是從 生成command
,則使用:
command | awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/'
怎麼運作的
/^section/{f=0}
每當我們找到以 開頭的行時
section
,請設定f=0
。/^section TWO/{f=1}
如果該行以 開頭
section TWO
,則覆寫先前的命令並設定f=1
。f && /text_c/
如果
f
是非零且當前行匹配text_c
,則列印該行。
答案2
你也可以這樣做sed
:
command | sed -n -e '/section TWO/,/section THREE/ { /text_c/p;}'
這是透過以下方式實現的:
-n
告訴sed
預設不列印匹配行-e
給出sed
一個要處理的腳本/section TWO/,/section THREE/
設定我們的位址範圍,因此我們將把下一個函數應用於符合section TWO
和的行之間的所有行section THREE
{ /text_c/p;}
定義將與一行匹配的函數text_c
,如果找到它將p
列印它
答案3
如果每個部分後面的行數有些恆定,您可以使用 '-AX' grep 中的列印選項X節匹配後的行。然後可以將其透過管道傳輸到第二個 grep,該 grep 在「第二節」中找到您的模式。
$ cat file
section ONE
1 text_a
1 text_b
1 text_c
section TWO
2_text_a
2 text_b
2 text_c
section THREE
3 text_a
3 text_b
3 text_c
$ grep -A3 'section TWO' file | grep text_c
2 text_c