Veuillez noter que l' tr -s ' '
option ne supprimera aucun espace de début unique. Si votre colonne est alignée à droite (comme avec ps
pid) ...
$ ps h -o pid,user -C ssh,sshd | tr -s " "
1543 root
19645 root
19731 root
Ensuite, la coupe entraînera une ligne vide pour certains de ces champs s'il s'agit de la première colonne:
$ <previous command> | cut -d ' ' -f1
19645
19731
A moins que vous ne le précédiez d'un espace, évidemment
$ <command> | sed -e "s/.*/ &/" | tr -s " "
Maintenant, pour ce cas particulier de nombres pid (pas de noms), il existe une fonction appelée pgrep
:
$ pgrep ssh
Fonctions du shell
Cependant, en général, il est encore possible d'utiliser les fonctions du shell de manière concise, car il y a une chose intéressante à propos de la read
commande:
$ <command> | while read a b; do echo $a; done
Le premier paramètre à lire, a
sélectionne la première colonne, et s'il y en a plus, tout le reste sera inséré b
. Par conséquent, vous n'avez jamais besoin de plus de variables que le numéro de votre colonne +1 .
Donc,
while read a b c d; do echo $c; done
affichera alors la 3e colonne. Comme indiqué dans mon commentaire ...
Une lecture canalisée sera exécutée dans un environnement qui ne transmet pas de variables au script appelant.
out=$(ps whatever | { read a b c d; echo $c; })
arr=($(ps whatever | { read a b c d; echo $c $b; }))
echo ${arr[1]}
La solution Array
On se retrouve donc avec la réponse de @frayser qui est d'utiliser la variable shell IFS qui par défaut est un espace, pour diviser la chaîne en un tableau. Cela ne fonctionne que dans Bash. Dash et Ash ne le supportent pas. J'ai eu du mal à diviser une chaîne en composants dans un objet Busybox. Il est assez facile d'obtenir un seul composant (par exemple en utilisant awk) et de le répéter pour chaque paramètre dont vous avez besoin. Mais vous finissez par appeler à plusieurs reprises awk sur la même ligne, ou à plusieurs reprises en utilisant un bloc de lecture avec écho sur la même ligne. Ce qui n'est ni efficace ni joli. Alors vous finissez par vous séparer en utilisant ${name%% *}
etc. Vous donne envie de certaines compétences Python car en fait, les scripts shell ne sont plus très amusants si la moitié ou plus des fonctionnalités auxquelles vous êtes habitué ont disparu. Mais vous pouvez supposer que même python ne serait pas installé sur un tel système, et ce n'était pas le cas ;-).