如何在找到一些文字後閱讀某些行?

如何在找到一些文字後閱讀某些行?

找到一些文字後如何讀取一定數量的行?

例如。

在以下位置找到“Unix”後閱讀接下來的兩行:

Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9

結果可以是:

Test 5
Test 6

注意:最後一個範例中的“Unix”是一個參數,因此它可以是任何其他文字。

我擁有的:

我仍然沒有想法,只需要一盞燈。考慮創建另一個腳本來做到這一點。

答案1

一個grep辦法:

grep -A2 -P '^UNIX$' file

解釋: -A意思是:在匹配後列印接下來的兩行

或者awk:

awk '$0=="UNIX"{getline; print; getline; print}' file

解釋:在 ( ) 行中搜尋 UNIX $0=="UNIX"。如果找到,則將下一行放入緩衝區 ( getline) 並列印緩衝區 ( print)。這要進行兩次。

或使用sed

sed -n '/^UNIX$/{n;p;n;p}' file

解釋:搜尋 UNIX ( /^UNIX$/)。如果找到,則執行{...}.n意思是下一個,p意思是列印。這也完成兩次。

答案2

解決方案awk

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6

解釋

  • /^UNIX$/{i=1;next}:如果我們看到UNIX,我們設定變量i = 1,處理下一個輸入。

  • i如果設定了變數(意味著我們看到了UNIX),i && i++ <= 2則僅在接下來的兩行中評估為真值UNIX,從而導致awk執行預設操作print $0

  • 在看到 之前UNIXi沒有定義,並且從 後的第 3 行開始UNIXi有一個大於 2 的值,這使得表達式i && i++ <= 2評估為 false,導致awk不執行任何操作。

答案3

grep -A 2 UNIX file.txt

grep 的線上幫助頁描述了這個選項:

  -A NUM, --after-context=NUM
      Print NUM  lines  of  trailing  context  after  matching  lines.
      Places  a  line  containing  --  between  contiguous  groups  of
      matches.

答案4

您可以使用ex

ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin

在哪裡:

  • 1,/UNIX/d-匹配後刪除文本
  • %p- 列印緩衝區
  • q!- 退出而不儲存文件的變更(用於wq就地編輯)

相關內容