Что выведет двухступенчатый конвейер awk поверх ps -ef?
Дана команда ниже — точно укажите, какой столбец данных окажется на экране и почему. ps -ef печатает таблицу процессов со столбцами UID PID PPID C STIME TTY TIME CMD.
Ограничения: рассуждайте только о нумерации полей; не запускайте. Учтите, что второй awk пересоздаёт поля по своему разделителю.
ps -ef | awk '{print $2":"$8}' | awk -F: '{print $1}'
Определите вывод.
Выведется столбец PID. Первый awk склеивает поле 2 (PID) и поле 8 (CMD) как PID:CMD. Второй awk -F: разбивает строку по : и печатает $1 — часть до первого двоеточия, то есть PID. Так как команда может содержать двоеточия, границей служит лишь первое, поэтому $1 остаётся PID. Например 1234:/usr/bin/sshd схлопывается в 1234.
- ✗Сбиваться в нумерации полей
ps -ef—$2это PID, а не PPID - ✗Думать, что
-F:оставляет часть после двоеточия, а не$1до него - ✗Забывать, что разбивает лишь первое
:, так что команда с двоеточиями безопасна
- →Как изменить конвейер, чтобы вывести команду вместо PID?
- →Почему передавать вывод
psвawkненадёжно, если значение столбца содержит пробелы?
Решение
ps -ef печатает таблицу со столбцами UID PID PPID C STIME TTY TIME CMD, то есть $2 — это PID, а $8 — команда.
ps -ef | awk '{print $2":"$8}' | awk -F: '{print $1}'
например 1234:/usr/bin/sshd.
часть до первого двоеточия, то есть 1234.
- Первый
awkдля каждой строки печатает$2":"$8— то естьPID:CMD, - Второй
awk -F:меняет разделитель полей на:и печатает$1—
Итог — столбец PID всех процессов. Даже если команда содержит двоеточия (1234:/a:b), границей служит только первое двоеточие, поэтому $1 остаётся ровно PID.