找到一些文字後如何讀取一定數量的行?
例如。
在以下位置找到“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
。在看到 之前
UNIX
,i
沒有定義,並且從 後的第 3 行開始UNIX
,i
有一個大於 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
就地編輯)