awk: imprime linhas após a correspondência até o final do arquivo

4

Estou tentando analisar uma mensagem de uso como:

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
...

para capturar apenas os nomes Command . Portanto, estou tentando ignorar todas as linhas até e incluindo a linha Commands: e, em seguida, imprimo a primeira palavra em todas as linhas a seguir, ou seja,

  build
  bundle
  ...

Atualmente estou fazendo

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

e enquanto isso funciona, eu suspeito que eu poderia fazer a coisa toda com um único awk . O mais perto que cheguei até agora é:

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

Mas isso inclui a linha Commands: correspondente. Pode ser feito?

    
por ivan 20.06.2017 / 02:23

2 respostas

9

Se você marcar a presença da sua cerca, poderá usá-la para decidir imprimir a próxima linha e, depois, como:

awk 'x==1 {print $1} /Commands:/ {x=1}'
    
por 20.06.2017 / 02:43
2

Note que 1,/Commands:/d traduz facilmente para awk como:

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

Uma diferença com sed é que também funcionará se Command: estiver na primeira linha.

E o NF {print $1} pode ser traduzido para sed :

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