Linux - 從某些行到檔案末尾的“grep”

Linux - 從某些行到檔案末尾的“grep”

我有一個與此類似的文本文件:

line 1
line 2A
line 3
line 4A
line 5

我想從“line 2A”“grep”到文件末尾,像這樣

cat file.txt|some_grep "line 2A"

另外,我想從“line 2A”“grep”到包含“A”的下一行,像這樣

cat file.txt| some_grep "A"

我想要印出來:

line 2A
line 3
line 4A

哪一個命令可以幫助我實現這個目標?

答案1

(從評論中擴展)

awk能夠選擇完全符合此需求的行“範圍”,如GNU-awk (gawk) 手冊中描述。 (此功能適用於其他awk系統,但gawk手冊很容易連結。)

awk '/line 2A/,0'列印從第一個匹配的行開始line 2A,一直列印到輸入結束,因為0是一個永遠不會為真的條件。

awk '/line 2A/,/A/&&!/line 2A/'從匹配的行開始列印,並在匹配但不line 2A匹配的行之後停止(因此不能與起始行在同一行)。它將開始Aline 2A再次在一個隨後的 line 2A等等;如果你想防止這種情況,有稍微複雜的方法可以做到這一點。

如果停止行總是有一些除2之前以外的字符,A則可以簡化為awk '/line 2A/,/[^2]A/'在匹配除 2 之外的任何字符的行之後停止,後跟 A。與2A 不同,但與其他類似WHAT;為此,停止條件可能是,/line [013-9]A/

答案2

我想從“line 2A”“grep”到文件末尾:

sed -n '/2A/,$p'
  • -n :抑制sed預設輸出
  • /2A/ :第一個包含「2A」的輸出行
  • $ : 到文件末尾

我想從“line 2A”“grep”到包含“A”的下一行:

sed -n '/2A/,/A/p'
  • /A/ :輸出直到一行包含“A”

我想從包含“A”的第一行“grep”到下一行:

printf "/A\n.+1,/A/p\nq" | ed -s

$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"

$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5

$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A

$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A

答案3

我認為最好的方法是與grep和結合。首先,使用 grep 取得所需字串所在的行(輸出行號;在第一個符合後停止搜尋):cuttail-n-m 1

grep -n -m 1 "somestring" filename.txt

這會輸出行號和字串本身。要剪切字串,我們使用 cut (-f1:輸出第一個欄位;-d:使用「:」作為分隔符號):

grep -n -m 1 "somestring" filename.txt | cut -f1 -d:

接下來,我們使用該指令的輸出作為 tail 中的參數。通常,tail 會列印最後 k 行,但使用-n +k,我們可以讓 tail 從第 k 行開始列印。總命令是:

tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt

輸出行直到somestring使用head代替tail-n -#代替-n +#。您也可以將兩者結合起來以獲取從一個字串到另一個字串的行。

答案4

請嘗試以下程式碼 -

sed -n '6,$p' infile

相關內容