Linux - 特定の行からファイルの末尾まで「grep」する

Linux - 特定の行からファイルの末尾まで「grep」する

次のようなテキスト ファイルがあります。

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

「行 2A」からファイルの最後までを「grep」したいのですが、次のようになります。

cat file.txt|some_grep "line 2A"

また、私は「行 2A」から「A」を含む次の行まで「grep」したいのですが、次のようになります。

cat file.txt| some_grep "A"

これを印刷したい:

line 2A
line 3
line 4A

これを実現するにはどのコマンドが役立ちますか?

答え1

(コメントから拡大)

awkこのニーズに完全に一致する行の「範囲」を選択する機能があります。GNU-awk (gawk) マニュアルに記載されている(この機能は他のawks でも動作しますが、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 以外の任意の 1 桁の数字の A で停止し、 のような他の A では停止しないようにしますWHAT。その場合、停止条件は になります,/line [013-9]A/

答え2

「行 2A」からファイルの最後までを「grep」したい:

sed -n '/2A/,$p'
  • -n :sedデフォルトの出力を抑制する
  • /2A/ : 「2A」を含む最初の行から出力します。
  • $ : ファイルの末尾まで

「行 2A」から「A」を含む次の行まで「grep」したい:

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を使用します。また、両方を組み合わせて、ある文字列から別の文字列までの行を取得することもできます。headtail-n -#-n +#

答え4

以下のコードを試してください -

sed -n '6,$p' infile

関連情報