複数行の出力を加工して、コマンドに引数として渡すワンライナー


数年前はよくやってたけど、ど忘れしてしまった・・・

https://twitter.com/s\_tsuka/status/1224705159898583042

けど、親切なフレンドが教えてくれました。ありがとう!

https://twitter.com/haya14busa/status/1224709493629628416

完全にそれですわ!ありがとう!
というわけで、忘れない様にここにメモしておきます。

例

[tsukaby@tsukaby tmp]% docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                    PORTS                                            NAMES
3a5e9cd9676c        nginx:alpine              "nginx -g 'daemon of…"   24 minutes ago      Up 10 minutes             0.0.0.0:80->80/tcp                               tmp_nginx_1
9a7dc65d79d8        node:12.13.1-alpine3.10   "docker-entrypoint.s…"   24 minutes ago      Up 10 minutes             0.0.0.0:3000->3000/tcp, 0.0.0.0:9229->9229/tcp   tmp_node_1
8a0a7303a095        mariadb:10.4.10           "docker-entrypoint.s…"   25 minutes ago      Up 11 minutes (healthy)   0.0.0.0:3306->3306/tcp                           tmp_db_1

これをまとめてkillしたいとする。(-qで出力を簡略化できるけど、それは使えなかったり知らないとする。)

[tsukaby@tsukaby tmp]% docker ps | awk 'NR>1 {print $1}' | xargs docker kill
3a5e9cd9676c
9a7dc65d79d8
8a0a7303a095

ポイント

  • 加工はawk
  • NR>1で1行目のCONTAINERを消す
  • print $1で1列目だけ出力
  • xargsでパイプからコマンドに引数を与えて実行

以上です。