Используя 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

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

3 ответа

Решение

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

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

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

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

ps -eopid,uid,cmd

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

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

Вопрос в том, что делать, когда у вас есть список. Я нахожу 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
Другие вопросы по тегам