在檔案/輸入中尋找字串模式,上下文相關搜尋(不像 grep)

在檔案/輸入中尋找字串模式,上下文相關搜尋(不像 grep)

是否有任何實用程式可用於查找文本,例如在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

相關內容