最初の一致の後、特定の行から始まり、2 つの一致の間の特定の行範囲を印刷します。

最初の一致の後、特定の行から始まり、2 つの一致の間の特定の行範囲を印刷します。

最初のゲームの後、特定の行から始めて、2つのゲーム間のすべてのデータをどのように印刷できますか?たとえば、2つのパターンLinuxがあり、これら2つの単語の間に項目があり、単語の後の特定の行(以下の例ではLinuxの後の6行目、単語まで)のUnixデータを印刷したいとします。LinuxUnix

Linux
12
32
34
556
676
77
85434
rdb
232323
232435656
Unix
98736
4345
4546456
456

予想出力:

85434
rdb
232323
232435656

awk、sed、および grep を使用してこの操作をどのように実行できますか?

答え1

相手のアドレス指定が表示されるたびに、手を伸ばして探してみる必要がありますed

echo '/Linux/+7,/Unix/-1p' | ed -s input_file.txt -

または整理として:

ed -s input_file.txt - <<\EOF
/Linux/+7,/Unix/-1p
EOF

答え2

この試み、

awk '/^Linux$/{flag=1;next}/^Unix$/{flag=0}flag' file | tail -n +7

またはtail

awk '/^Linux$/{flag=1;n=NR;next}/^Unix$/{flag=0};flag&&NR>(n+6);' file

説明する:

  • パターンを検索して^Linux$検出すると、flag1(true)に設定され、nextその行に直接移動します。
  • ^Unix$パターンが見つかるまで続行してflag0(false)に設定します。
  • 最後のflagものはawk固有のシンボルです。 true の場合はflag行を印刷し、それ以外の場合は何もしません。
  • flag変数名だけがあれば、f何でも構いませんprintthisline

Gnuの使用sed

sed '/^Linux$/,/^Unix$/{//!b};d' file | tail -n +7

答え3

そのうちの1つを書きます。

sed -n '/Linux/,/Unix/p' file | sed '1,7d;$d'
# or
awk '/Linux/ {nr = NR} /Unix/ {exit} nr && NR > nr+6' file

答え4

検索すると、grep次のようにできます。

  • grep -A 5 "string used to search" <path-to-file(s)>一致する文字列の後に5行が表示されます。
  • grep -B 5 "string used to search" <path-to-file(s)>一致する文字列の前に5行が表示されます。
  • grep -C 5 "string used to search" <path-to-file(s)>一致する文字列の前後5行が表示されます(Cはコンテキストを表します)。

あなたの例は次のとおりです grep -A 2 -B 1 "rdb" <path-to-file(s)>

関連情報