awk:ファイルの終わりと一致した後の行の印刷

awk:ファイルの終わりと一致した後の行の印刷

次の使用法メッセージを解析しようとしています。

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help
...
Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
...

Command名前だけをインポートしてください。したがって、Commands:この行の前のすべての行をスキップして、次の行の最初の単語を印刷したいと思います。

  build
  bundle
  ...

現在私はやっています

docker-compose --help | sed -e '1,/Commands:/d' | awk '{ print $1 }'

これが機能している間に1つを使用できるかどうか疑われますawk。これまでに最も近いのは次のとおりです。

docker-compose --help | awk '/Commands:/,0 { print $1 }'

ただし、これには一致するCommands:行が含まれます。できますか?

答え1

フェンスの存在を表示したら、フェンスを使用して、次の行とそれに続く行を印刷するかどうかを決定できます。たとえば、次のようになります。

awk 'x==1 {print $1} /Commands:/ {x=1}'

答え2

これは次のように1,/Commands:/d簡単に解釈されますawk

awk 'NR==1, $1 == "Commands:" {next}; NF {print $1}'

違いは、sed最初の行にある場合でも機能することです。Command:

NF {print $1}次のように翻訳できますsed

sed -n '1,/^Commands:/!s/^[[:blank:]]*\([^[:blank:]]\{1,\}\).*/\1/p'

答え3

sed -n '/Commands:/,$p' filename | awk 'NR!=1{print $1}'

関連情報