Захват столбца из вывода команды и преобразование его в строку, чтобы вы могли передать его дальше.
Простейший сценарий использования – преобразовать вывод одного столбца в строку, разделенную табуляцией.
$ pgrep dnsmasq | paste -s
2430 2431
Это решение не очень хорошо работает с выводом ps, так как вы получаете избыточные пробелы, потому что данные выровнены по ним.
$ ps -opid= -u netdata | paste -s
1943 1985 24046 24137
Вы можете удалить все пробелы и оставить значения разделенными, используя TAB
$ ps -opid= -u netdata | paste -s | tr -d ' '
1943 1985 24046 24137
Кроме того, вы можете сжимать пробелы, игнорировать их в начале строки и использовать оставшиеся пробелы для разделения значений.
$ ps -opid= -u netdata | paste -s -d " " | tr -s ' ' | sed 's.^ *..'
1943 1985 24046 24137
Это немного сложнее, когда вы хотите извлечь конкретный столбец.
$ ps ax --no-header | grep -v grep | grep sshguard | tr -s " " | sed "s.^ *.." | cut -d " " -f1 | paste -s -d ' ' 1394 1449
Есть альтернатива, конечно.
Используйте awk для вывода определенного столбца, используя пользовательский разделитель выходных записей (встроенная переменная ORS).
$ ps ax --no-header | awk -v ORS=" " '/firefox/ {print $1} END{printf "\n"}'
3867 3947 4058 4352 4604 4688 22346
все на много проще:
pgrep dnsmasq | paste -s -d” ”
2430 2431
ИЛИ
echo $(pgrep dnsmasq)
2430 2431
ИЛИ
echo $(ps -C dnsmasq -o pid=)
2430 2431
Чем короче строка, тем меньше ошибок…
а таким образом можно обратно из строки в столбец:
echo -e {1..5} | tr -s ‘ ‘ ‘\n’
1
2
3
4
5
ИЛИ
for i in {1..5}; do echo $i; done
1
2
3
4
5