242 votes

Comment obtenir la deuxième colonne de la sortie de commande ?

La sortie de ma commande est quelque chose comme :

1540 "A B"
   6 "C"
 119 "D"

La première colonne est toujours un nombre, suivi d'un espace, puis d'une chaîne de caractères entre guillemets.

Mon but est d'obtenir la deuxième colonne seulement, par exemple :

"A B"
"C"
"D"

J'avais l'intention d'utiliser <some_command> | awk '{print $2}' pour y parvenir. Mais la question est la suivante : certaines valeurs de la deuxième colonne contiennent un ou plusieurs espaces, qui se trouvent être le délimiteur par défaut de l'option awk pour séparer les champs. Par conséquent, la sortie est désordonnée :

"A
"C"
"D"

Comment obtenir proprement la valeur de la deuxième colonne (avec les guillemets) ?

296voto

Alex Points 3448

Utilisez -F [field separator] pour diviser les lignes sur " s :

awk -F '"' '{print $2}' your_input_file

ou pour une entrée à partir d'un tuyau

<some_command> | awk -F '"' '{print $2}'

sortie :

A B
C
D

119voto

TheAshwaniK Points 351

Si vous pouvez utiliser autre chose que 'awk', essayez plutôt ceci

echo '1540 "A B"' | cut -d' ' -f2-

-d est un délimiteur, -f est le champ à couper et avec -f2- nous avons l'intention de couper le 2ème champ jusqu'à la fin.

102voto

hemanto Points 544

Cela devrait fonctionner pour obtenir une colonne spécifique à partir de la sortie de la commande "docker images" :

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
ubuntu                              16.04               12543ced0f6f        10 months ago       122 MB
ubuntu                              latest              12543ced0f6f        10 months ago       122 MB
selenium/standalone-firefox-debug   2.53.0              9f3bab6e046f        12 months ago       613 MB
selenium/node-firefox-debug         2.53.0              d82f2ab74db7        12 months ago       613 MB

docker images | awk '{print $3}'

IMAGE
12543ced0f6f
12543ced0f6f
9f3bab6e046f
d82f2ab74db7

Cela va imprimer la troisième colonne

35voto

catay Points 86

Ou utilisez sed et regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'

23voto

kenorb Points 2464

Vous n'avez pas besoin d'awk pour cela. Utilisation de read dans le shell Bash devrait être suffisant, par exemple

some_command | while read c1 c2; do echo $c2; done

ou :

while read c1 c2; do echo $c2; done < in.txt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X