ここ最後の一致以降のすべての行を印刷するリンク。
しかし、最後の一致から2行だけ印刷したいです。どうすればいいですか?
答え1
あなたが使用できるed
:
printf '%s\n' '?pattern?+1, ?pattern?+2 p' | ed -s file
ed
これはstdinにコマンドを送信します。この-s
フラグは、ファイルを読み込むときのバイト数の出力を抑制します。コマンドは次のように分類されます。
... , ... p
- 与えられた(...、...)アドレス範囲内の行を印刷します。?pattern?+1
- 戻る検索でpattern
1つ追加?pattern?+2
- 戻る検索でpattern
2つ追加
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
sed
2行が欲しいと仮定して使用してください。後ろに最後の一致(そして各一致行が他の一致行から少なくとも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
コマンドは次の行を読み込みます。後続の行はバッファに追加され、両方の行は予約済みスペースにコピーされます(以前に保存された内容を上書きします)。n
pattern
N
h
最後の行に達すると、予約されたスペースが得られます。このスペースは、行の一致後に最新の 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から予約された空間データが検索され、最初の行(モデル行)が削除されます。