Обратите внимание, что эта tr -s ' '
опция не удаляет отдельные ведущие пробелы. Если ваш столбец выровнен по правому краю (как с ps
pid) ...
$ ps h -o pid,user -C ssh,sshd | tr -s " "
1543 root
19645 root
19731 root
Тогда вырезание приведет к пустой строке для некоторых из этих полей, если это первый столбец:
$ <previous command> | cut -d ' ' -f1
19645
19731
Если вы не поставите перед ним пробел, очевидно
$ <command> | sed -e "s/.*/ &/" | tr -s " "
Теперь, для этого конкретного случая номеров pid (не имен), есть функция, называемая pgrep
:
$ pgrep ssh
Функции оболочки
Однако в целом на самом деле все еще можно использовать функции оболочки в сжатой форме, потому что в read
команде есть отличная особенность :
$ <command> | while read a b; do echo $a; done
Первый параметр для чтения a
,, выбирает первый столбец, и, если их больше, все остальное будет вставлено b
. В результате вам никогда не понадобится больше переменных, чем номер вашего столбца +1 .
Так,
while read a b c d; do echo $c; done
затем выведет 3-й столбец. Как указано в моем комментарии ...
Чтение по конвейеру будет выполнено в среде, которая не передает переменные вызывающему скрипту.
out=$(ps whatever | { read a b c d; echo $c; })
arr=($(ps whatever | { read a b c d; echo $c $b; }))
echo ${arr[1]}
Решение для массива
Таким образом, мы получаем ответ от @frayser, который заключается в использовании переменной оболочки IFS, которая по умолчанию равна пробелу, чтобы разбить строку на массив. Однако это работает только в Bash. Дэш и Эш этого не поддерживают. Мне было очень трудно разделить строку на компоненты в Busybox. Достаточно просто получить один компонент (например, используя awk), а затем повторить это для каждого необходимого параметра. Но затем вы в конечном итоге многократно вызываете awk в той же строке или многократно используете блок чтения с эхо в той же строке. Что неэффективно и не красиво. Таким образом, вы в конечном итоге разделяете, используя ${name%% *}
и так далее. Заставляет вас стремиться к некоторым навыкам Python, потому что на самом деле создание сценариев оболочки перестает быть большим удовольствием, если половина или более функций, к которым вы привыкли, исчезли. Но вы можете предположить, что даже python не был бы установлен в такой системе, и это не так ;-).