
[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
не дает желаемого результата, так как между столбцами больше одного пробела.