Należy pamiętać, że tr -s ' '
opcja nie usunie żadnych pojedynczych spacji wiodących. Jeśli twoja kolumna jest wyrównana do prawej (jak w przypadku ps
pid) ...
$ ps h -o pid,user -C ssh,sshd | tr -s " "
1543 root
19645 root
19731 root
Wycinanie spowoduje powstanie pustej linii dla niektórych z tych pól, jeśli jest to pierwsza kolumna:
$ <previous command> | cut -d ' ' -f1
19645
19731
Chyba że poprzedzisz go spacją, oczywiście
$ <command> | sed -e "s/.*/ &/" | tr -s " "
Teraz, dla tego konkretnego przypadku numerów pid (nie nazw), istnieje funkcja o nazwie pgrep
:
$ pgrep ssh
Funkcje powłoki
Jednak ogólnie rzecz biorąc, nadal można używać funkcji powłoki w zwięzły sposób, ponieważ polecenie jest fajne read
:
$ <command> | while read a b; do echo $a; done
Pierwszy parametr do odczytania a
,, wybiera pierwszą kolumnę, a jeśli jest ich więcej, wszystko inne zostanie wstawione b
. W rezultacie nigdy nie potrzebujesz więcej zmiennych niż liczba Twojej kolumny +1 .
Więc,
while read a b c d; do echo $c; done
wyświetli trzecią kolumnę. Jak wskazałem w moim komentarzu ...
Odczyt potokowy zostanie wykonany w środowisku, które nie przekazuje zmiennych do skryptu wywołującego.
out=$(ps whatever | { read a b c d; echo $c; })
arr=($(ps whatever | { read a b c d; echo $c $b; }))
echo ${arr[1]}
Rozwiązanie macierzy
W rezultacie otrzymujemy odpowiedź od @frayser, która polega na użyciu zmiennej powłoki IFS, która domyślnie jest spacją, aby podzielić ciąg na tablicę. Działa jednak tylko w Bash. Dash i Ash tego nie obsługują. Naprawdę ciężko mi było rozdzielić łańcuch na komponenty w Busybox. Dość łatwo jest uzyskać pojedynczy komponent (np. Używając awk), a następnie powtórzyć to dla każdego potrzebnego parametru. Ale w końcu wielokrotnie wywołujesz awk w tej samej linii lub wielokrotnie używasz bloku odczytu z echem w tej samej linii. Co nie jest wydajne ani ładne. Więc kończysz rozdzielając używając ${name%% *}
i tak dalej. Sprawia, że tęsknisz za niektórymi umiejętnościami Pythona, ponieważ w rzeczywistości skrypty powłoki nie są już zbyt zabawne, jeśli zniknie połowa lub więcej funkcji, do których jesteś przyzwyczajony. Ale można założyć, że nawet python nie zostałby zainstalowany na takim systemie, a nie był ;-).