sed スクリプトは、最後の一致から n 行を出力します。

sed スクリプトは、最後の一致から n 行を出力します。

ここ最後の一致以降のすべての行を印刷するリンク。

しかし、最後の一致から2行だけ印刷したいです。どうすればいいですか?

答え1

あなたが使用できるed

printf '%s\n' '?pattern?+1, ?pattern?+2 p' | ed -s file

edこれはstdinにコマンドを送信します。この-sフラグは、ファイルを読み込むときのバイト数の出力を抑制します。コマンドは次のように分類されます。

  • ... , ... p- 与えられた(...、...)アドレス範囲内の行を印刷します。
  • ?pattern?+1- 戻る検索でpattern1つ追加
  • ?pattern?+2- 戻る検索でpattern2つ追加

pattern現在のデフォルトはファイルの最後の行なので、これらの検索はファイル内の最後の項目を探します。その後、オフセットは次の2行を選択します。

答え2

GNUを使用grepしてtailαГsнιmet用のサンプルファイル:

$ cat file
====
1
2
3
4
====
11
22
33
====
111
222
333
444
====
1111
2222
3333

$ grep  -A2 "====" file  | tail -n2
1111
2222

一致する行(この場合は検索-A2中の行)とその後の2行を印刷するように指示します。これにより、最後の2行だけが印刷されます。grep====tail -n2

ファイルが非常に大きい場合は、tacファイルの終わりから読み取ってロジックを逆にすると、作業を高速化できます。

$ tac file | grep -m1 -B2 "====" | tac |tail -n2
1111
2222

答え3

sed2行が欲しいと仮定して使用してください。後ろに最後の一致(そして各一致行が他の一致行から少なくとも2行以上離れているとpattern仮定):pattern

$ cat file
a
b       pattern
c       the 1st
d       the 2nd
e       the 3rd
1
2
3       pattern
4       the first
5       the second
6       the third
7
$ sed -n -e '/pattern/ { n; N; h; }' -e '$ { g; /./p; }' file
4       the first
5       the second

一致するものがある場合、sedコマンドは次の行を読み込みます。後続の行はバッファに追加され、両方の行は予約済みスペースにコピーされます(以前に保存された内容を上書きします)。npatternNh

最後の行に達すると、予約されたスペースが得られます。このスペースは、行の一致後に最新の 2 行を含むか、一致するものがない場合は空にpatternなります。patternバッファが空でない場合は出力します。

得るためにサム行の後の行を一致させるには、代わりにをpattern使用します。n; N; N; h;n; N; h;

行一致後に3行を取得しますpattern(現在、一致する行が少なくとも3行以上離れていると仮定します).

$ sed -n -e '/pattern/ { n; N; N; h; }' -e '$ { g; /./p; }' file
4       the first
5       the second
6       the third

pattern遠くの行を一致させる必要がないようにするには、読んだ「後の行」が一致することを確認し、一致する場合はそこから再起動する必要がありますpattern

sed -n -e ':a' -e '/pattern/ { n; /pattern/ba; N; /pattern/ba; h; }' -e '$ { x; /./p; }' file

答え4

GNU sed拡張正規表現モードでは、-E シェル変数を表示する行数に変更します。

n=2
sed -Ee '
  /\n/q
  /pattern/{
    :loop
      $d;N
    /(.*\n){'"$n"'}/!bloop
    x
  }
  $!d;x
  /\n.*\n/D
  s/.*\n//p;d
' file
  • パターンラインを見つけたら、ループを設定してパターンスペースにラインを蓄積します。
  • パターンラインの後にn番目のラインが見えたら停止します。 (パターンラインを除く)
  • このn + 1行を保留状態に保存し、eofに達していない場合は、可能な次のパターンの検索を再開します。
  • 最後に、eofから予約された空間データが検索され、最初の行(モデル行)が削除されます。

関連情報