Обратите внимание, что опция 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]} # will output 'b'`
The Array Solution
Таким образом, мы в итоге получаем ответ от @frayser, который должен использовать переменную оболочки IFS, которая по умолчанию устанавливается на пробел, чтобы разбить строку на массив. Это работает только в Bash, хотя. Дэш и Эш не поддерживают это. Мне было очень трудно разделить строку на компоненты в Busybox. Достаточно просто получить один компонент (например, используя awk), а затем повторить это для каждого необходимого параметра. Но затем вы в конечном итоге неоднократно вызываете awk в одной и той же строке или постоянно используете блок чтения с echo в той же строке. Что не эффективно или красиво. Таким образом, вы в конечном итоге разбиваете, используя ${name%% *}
и так далее. Заставляет вас жаждать некоторых навыков Python, потому что на самом деле создание сценариев оболочки уже не доставляет большого удовольствия, если половина или более функций, к которым вы привыкли, пропали. Но вы можете предположить, что даже python не будет установлен в такой системе, и это не так; -).