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