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