スクリプトにはいくつかの問題があります。当面の問題は、awk への 2 回目の呼び出しで、スクリプトを一重引用符で囲んでいるため$line_start
、$line_end
シェルによって変数が展開され、スクリプトの一部として文字通り awk に渡されることです。代わりに二重引用符を使用すると、これを修正できます。
awk "NR==$line_start, NR==$line_end" file
これは、$line_start
と$line_end
が数字であるためにのみ機能します。それらが文字列の場合、これを行うことはできません。シェル変数の値は、文字列としてではなく、awk コードの一部として awk によって解析されることになるためです。一般に、文字列を awk スクリプトに渡すには、イディオム with を使用し-v
て、シェル変数と同じ名前 (または必要に応じて別の名前) で awk 変数を定義できます。
awk -v "line_start=$line_start" -v "line_end=$line_end" 'NR==line_start, NR==line_end' file
スクリプトにはさらに問題があります。
- ファイルを 2 回解析します。ファイルが大きい場合、これは遅くなる可能性があり、データがディスク ファイルではなくパイプから来る場合は不可能です。
- に複数の一致がある場合は
/regex/
、$line_start
行番号のリストが含まれます。シェルは、そのlet
行で構文エラーを報告します。
一致後に 5 行を表示する場合は、awk 内でカウントを行います。
awk '
/regex/ { show_lines = 5 }
show_lines { print; --show_lines; }
' file
最初に一致したブロックのみを表示したい場合は、show_lines
0 に達したら終了します。
show_lines { print; --show_lines; if (!show_lines) exit; }