1 votes

Comment compresser les espaces dans la sortie de la commande bash ?

Je travaille sur un petit écran et j'essaie de rendre la sortie de cette commande plus courte, mais je n'y arrive pas.

Commandement : docker container ls --all

Sortie (trop large !) :

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

La sortie que je veux :

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

Voici quelques-unes des quelque 20 variations que j'ai essayées, mais aucune n'a fonctionné :

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"

Je soupçonne qu'il y a quelque chose de fondamentalement faux dans ma compréhension des tuyaux et/ou de sed.

2voto

rav Points 56

Vous pouvez également essayer d'utiliser l'option --format. Voici l'option lien à la référence docker.

J'ai essayé de recréer le résultat souhaité en utilisant l'option de format.

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:~#

1voto

marshally Points 2260

Le malentendu est que par défaut, sed utilise expressions régulières de base ( https://www.gnu.org/software/gnulib/manual/html_node/ed-regular-expression-syntax.html ) -- Le quantificateur "un ou plusieurs" nécessite un antislash \+

Pour utiliser expressions régulières étendues ( https://www.gnu.org/software/gnulib/manual/html_node/egrep-regular-expression-syntax.html ), faites-le :

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

Notez que GNU sed accepte \s . Tous les seds ne le font pas.

1voto

laurens Points 107

Le mieux que vous puissiez faire est d'éditer la sortie avec des outils tels que sed est :

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

Cela fonctionnera dans n'importe quelle version de sed (compatible POSIX) (il n'est pas nécessaire de s'inquiéter du support GNU ou de savoir s'il faut ou non échapper un caractère + caractère) et nécessitera plus de deux caractères d'espacement afin de ne pas obtenir de délimiteurs supplémentaires, tels que 32 | minutes | ago

En fait, s/ */ | /g (trois espaces littéraux, puis un astérisque) devrait suffire, car je doute que vous obteniez des tabulations ou des caractères d'espacement plus exotiques.

Notez que la réponse "idéale" devrait avoir les champs vides correspondants (dans l'exemple de sortie, PORTS est vide). La sortie souhaitée de la question n'a pas d'entrée vide pour PORTS, ce qui est une bonne chose parce qu'il serait autrement impossible de l'analyser (sans modifier le code de l'utilisateur). docker ou en supposant qu'il y a au plus une entrée vide ou en ayant une autre connaissance intime des possibilités de sortie).

Par conséquent, La réponse de kottapar ce qui donne un résultat plus approprié docker est largement préférable.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X