Como compactar espaços na saída do comando bash?

1

Eu trabalho em uma tela pequena e estou tentando tornar a saída desse comando mais curta, mas não consigo fazer funcionar.

Comando: docker container ls --all

Saída (muito grande!):

CONTAINER ID        IMAGE                                                             COMMAND             CREATED             STATUS                        PORTS               NAMES
e56e7efd4c3c        137112412989.dkr.ecr.us-west-2.amazonaws.com/amazonlinux:latest   "/bin/bash"         32 minutes ago      Exited (127) 31 minutes ago                       ami-test

Saída que eu quero:

CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES
e56e7efd4c3c | 137112412989.dkr.ecr.us-west-2.amazonaws.com/amazonlinux:latest | "/bin/bash" | 32 minutes ago | Exited (127) 31 minutes ago | ami-test

Aqui estão algumas das cerca de 20 variações que eu tentei, nenhuma delas funcionou:

docker container ls --all  | sed "s/\s+/|/g"

docker container ls --all 2>&1 | sed -e 's/\s+//g'

docker container ls --all 2&1> | sed -e 's/[[:space:]]*/ /'

docker container list --all | sed -e "s/\t/ /g"

Eu suspeito que há algo fundamentalmente errado com minha compreensão de pipes e / ou sed.

    
por noctonura 14.10.2018 / 00:55

3 respostas

2

Talvez você também possa tentar usar a opção --format também. Aqui está o link para a referência do docker.

Eu tentei recriar sua saída desejada usando a opção de formato.

root@ubuntu:~# docker container ls --all --format "table {{.ID}} | {{.Image}} | {{.Command}} | {{.CreatedAt}} | {{.Status}} | {{.Ports}} | {{.Names}}"
CONTAINER ID | IMAGE | COMMAND | CREATED AT | STATUS | PORTS | NAMES
5b19f1d7efc1 | ubuntu | "bash" | 2018-10-14 08:11:03 +0000 UTC | Exited (0) 17 minutes ago |  | jovial_spence
05250b252a98 | hello-world | "/hello" | 2018-10-14 08:10:10 +0000 UTC | Exited (0) 18 minutes ago |  | practical_bohr
b206b0ad1f42 | hello-world | "/hello" | 2018-09-27 14:51:49 +0000 UTC | Exited (0) 2 weeks ago |  | nifty_gates
root@ubuntu:~#
    
por 14.10.2018 / 10:39
1

O equívoco é que o sed padrão usa expressões regulares básicas ( link ) - O quantificador" um ou mais "requer uma barra invertida \+

Para usar expressões regulares estendidas link ) faça isso:

docker container ls --all  | sed -E 's/\s+/ | /g'

Observe que o GNU sed aceita \s . Nem todos os seds fazem.

    
por 14.10.2018 / 02:41
1

O melhor que você pode fazer editando a saída com ferramentas como sed é:

docker container ls --all | sed 's/[[:space:]][[:space:]][[:space:]]*/ | /g'

Isso funcionará em qualquer versão do sed (compatível com POSIX) (não precisa se preocupar com o suporte GNU ou se deseja ou não escapar de um caracter + ) e exigirá mais de 2 caracteres de espaço para que você não obtenha delimitadores extras como 32 | minutes | ago

Na verdade, s/ */ | /g (três espaços literais e, em seguida, um asterisco) deve ser suficiente, pois duvido que você esteja obtendo guias ou mais caracteres de espaço exóticos.

Note que a resposta "ideal" deve ter campos em branco correspondentes (no exemplo de saída, o PORTS está vazio). A saída desejada da questão não possui a entrada em branco para PORTAS, o que é bom porque de outra forma seria impossível analisar (sem alterar o comando docker ou assumir no máximo uma entrada em branco ou ter outro conhecimento profundo das possibilidades de saída ).

Portanto, a resposta da kottapar , que fornece um comando docker mais apropriado, é muito preferível.

    
por 15.10.2018 / 18:48