112 votes

bash: split output de la commande par colonnes

Je veux faire ceci:

  1. exécuter une commande
  2. la capture de la sortie
  3. sélectionnez une ligne
  4. sélectionnez une colonne de cette ligne

Juste comme exemple, disons que je veux obtenir le nom de la commande à partir d'un $PID (veuillez noter que ceci est juste un exemple, je ne dis pas que c'est la meilleure façon d'obtenir un nom de commande à partir d'un id de processus - mon vrai problème, c'est avec une autre commande dont le format de sortie que je ne contrôle pas).

Si j'exécute ps je reçois:


  PID TTY          TIME CMD
11383 pts/1    00:00:00 bash
11771 pts/1    00:00:00 ps

Maintenant, je n' ps | egrep 11383 et obtenir

11383 pts/1    00:00:00 bash

Prochaine étape: ps | egrep 11383 | cut -d" " -f 4. La sortie est:

<absolutely nothing/>

Le problème est qu' cut coupe la sortie par des espaces simples, et en tant que ps ajoute de certains espaces entre les 2e et 3e colonnes de garder une certaine ressemblance d'une table, cut sélectionne une chaîne vide. Bien sûr, je pourrais utiliser cut pour sélectionner le 7 et non le 4ème champ, mais comment puis-je le sais, spécialement lorsque la sortie est variable et inconnue à l'avance.

196voto

unwind Points 181987

Un moyen facile est d'ajouter une passe de tr de serrer toutes les répétée séparateurs de champ:

$ ps | egrep 11383 | tr -s ' ' | cut -d ' ' -f 4

80voto

brianegge Points 12857

Je pense que le plus simple est d'utiliser awk. Exemple:

$ echo "11383 pts/1    00:00:00 bash" | awk '{ print $4; }'
bash

4voto

James Anderson Points 18253

essayez

ps |&
while read -p first second third fourth etc ; do
   if [[ $first == '11383' ]]
   then
       echo got: $fourth
   fi       
done

3voto

frayser Points 1270

À l'aide de variables de tableau

set $(ps | egrep "^11383 "); echo $4

ou

A=( $(ps | egrep "^11383 ") ) ; echo ${A[3]}

1voto

soulmerge Points 37314

De la ligne (par exemple pour la ligne no. 6) se fait avec la tête et la queue, et le mot correct (pas de mot. 4) peut être capturé avec awk:

command|head -n 6|tail -n 1|awk '{print $4}'

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