не получается желаемый результат при использовании команды cut?

не получается желаемый результат при использовании команды cut?
[root@localhost ~]#  ps aux | grep ata
root        19  0.0  0.0      0     0 ?        S    07:52   0:00 [ata/0]
root        20  0.0  0.0      0     0 ?        S    07:52   0:00 [ata_aux]
root      1655  0.0  2.6  22144 13556 tty1     Ss+  07:53   0:18 /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-t1gMCU/database -nolisten tcp vt1
root      3180  0.0  0.1   4312   728 pts/0    S+   14:09   0:00 grep ata
[root@localhost ~]#  ps aux | grep ata | cut -d" " -f 2

[root@localhost ~]#

Я ожидал бы второй столбец в выводе; но ничего не получаю. Есть идеи?

решение1

При использовании -d " "разделитель полей — один (и только один) символ пробела. В отличие от разделения слов оболочки, cutне обрабатывает пробел как любой другой символ. Поэтому cut -d " " -f2возвращает ""в root   19, как и возвращал бы ""для cut -d: -f2в root:::19.

Вам нужно будет либо сжать пробелы, чтобы преобразовать любую последовательность пространства водинкосмос:

ps aux | grep ata | tr -s ' ' | cut -d ' ' -f2

Или используйте awk, где в режиме разделения по умолчанию разделитель не используется, а разделяется на список последовательностей непустых символов:

ps aux | awk '/ata/{print $2}'

Однако в этом случае вы можете использовать:

pgrep -f ata

Или по крайней мере:

ps -eo pid= -o args= | awk '/ata/{print $1}'

Только для сопоставления с аргументами.

решение2

Использовать:

ps aux | awk '/ata/{print $2}'

Используемая вами команда cutне дает желаемого результата, так как между столбцами больше одного пробела.

Связанный контент