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}'
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?
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'
Tags text-processing awk