Tieni presente che l' tr -s ' '
opzione non rimuoverà alcun singolo spazio iniziale. Se la tua colonna è allineata a destra (come con ps
pid) ...
$ ps h -o pid,user -C ssh,sshd | tr -s " "
1543 root
19645 root
19731 root
Quindi il taglio risulterà in una riga vuota per alcuni di questi campi se è la prima colonna:
$ <previous command> | cut -d ' ' -f1
19645
19731
A meno che tu non lo preceda con uno spazio, ovviamente
$ <command> | sed -e "s/.*/ &/" | tr -s " "
Ora, per questo caso particolare di numeri pid (non nomi), esiste una funzione chiamata pgrep
:
$ pgrep ssh
Funzioni di shell
Tuttavia, in generale è ancora possibile utilizzare le funzioni della shell in modo conciso, perché c'è una cosa carina nel read
comando:
$ <command> | while read a b; do echo $a; done
Il primo parametro da leggere a
,, seleziona la prima colonna e, se ce n'è di più, verrà inserito tutto il restob
. Di conseguenza, non avrai mai bisogno di più variabili del numero della tua colonna +1 .
Così,
while read a b c d; do echo $c; done
produrrà quindi la terza colonna. Come indicato nel mio commento ...
Una lettura in pipe verrà eseguita in un ambiente che non passa variabili allo script chiamante.
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 soluzione array
Quindi finiamo con la risposta di @frayser che consiste nell'usare la variabile di shell IFS che ha come impostazione predefinita uno spazio, per dividere la stringa in un array. Funziona solo in Bash però. Dash e Ash non lo supportano. Ho avuto davvero difficoltà a dividere una stringa in componenti in una cosa Busybox. È abbastanza facile ottenere un singolo componente (ad esempio usando awk) e poi ripeterlo per ogni parametro di cui hai bisogno. Ma poi si finisce per chiamare ripetutamente awk sulla stessa riga o utilizzare ripetutamente un blocco di lettura con echo sulla stessa riga. Che non è efficiente o carino. Quindi finisci per dividere usando ${name%% *}
e così via. Ti fa desiderare alcune abilità di Python perché in effetti lo scripting di shell non è più molto divertente se metà o più delle funzionalità a cui sei abituato sono sparite. Ma puoi presumere che anche python non sarebbe stato installato su un sistema del genere, e non lo era ;-).