Используя bash ps и срезайте вместе

Мне нужно извлечь PID, UID и поля команд из 'ps', и я пробовал это следующим образом:

ps -L u n | cut -f 1,2,13

По какой-то причине это ведет себя так, как будто нет команды вырезания. Он просто возвращает нормальный вывод ps. Затем я попробовал

ps -L u n | tr -s " " | cut -d " " -f 1,2,13, и это возвращает полную бессмыслицу. Затем я попытался сыграть с ним и с этим:

ps -L u n | tr -s " " | cut -d " " -f 2,3,14

и это как-то возвращает то, что мне нужно (почти, и я не понимаю, почему это почти работает), за исключением того, что оно вырезает поле команды посередине. Как я могу получить то, что мне нужно?

Ответы

Ответ 1

ps печатает разделители пространства, но cut без -d использует символ табуляции. tr -s сжимает пространства вместе, чтобы получить больше разделения, которое вы хотите, но помните, что есть начальный набор пробелов (сжатый для одного), поэтому вам нужно добавить 1 к каждому полю. Кроме того, в командах для каждого слова есть пробелы. Это должно работать:

ps -L u n | tr -s " " | cut -d " " -f 2,3,14-

Ответ 2

Есть ли какая-то конкретная причина для использования cut?

Я думаю, это будет делать то, что вы хотите:

ps -eopid,uid,cmd

Ответ 3

Вы можете использовать awk для очистки вашей команды, например:

ps -L u n | awk '{ print $1,$2,$13 }'

Ответ 4

Вопрос в том, что делать, когда у вас есть список. Я нахожу cut kludgy, поэтому вместо cut я передаю список циклу чтения пока. "Пока чтение" распознает непустые значения в строке, поэтому в этом примере "a" - это первое значение, "b" - второе, а "c" - остальная часть строки. Меня интересуют только первые 2 значения, владелец процесса и идентификатор процесса; и я в основном злоупотребляю выражением по делу, а не использую "если". (Несмотря на то, что grep отфильтрован, я не хочу убивать процессы, где имя владельца может быть встроено в другом месте строки)

ps -ef | grep owner | grep -v grep | while read a b c; 
do 
 case $a in 
  "owner")
     kill -9 $b  
   ;; 
 esac; 
done