Когда я проверяю список процессов и выявляю те, которые мне интересны, grep
сам результат также включается в результаты. Например, для вывода списка терминалов:
$ ps aux | grep terminal
user 2064 0.0 0.6 181452 26460 ? Sl Feb13 5:41 gnome-terminal --working-directory=..
user 2979 0.0 0.0 4192 796 pts/3 S+ 11:07 0:00 grep --color=auto terminal
Обычно я использую, ps aux | grep something | grep -v grep
чтобы избавиться от последней записи ... но это не элегантно :)
Есть ли у вас более элегантный хак для решения этой проблемы (кроме того, что все команды объединены в отдельный скрипт, что тоже неплохо)
ps ux | awk '/name/ && !/awk/ {print $2}'
grep -v grep
делает часть?grep -v grep
исключаетgrep
из результатов grep. Если grep используется в сочетании с ps, то также будет показан процесс grep (с аргументами grep), который загромождает ваши результаты. grep -v grep - распространенный способ избежать этогоОтветы:
Обычная техника такова:
Это будет соответствовать строки, содержащие
terminal
, чтоegrep '[t]erminal'
не соответствует! Он также работает на многих вкусах Unix.источник
ps aux | grep '[r]oot'
. Кто-нибудь знает почему?| grep '[t]erminal'
выбирает любую строку, содержащую слово «терминал», без добавления слова «терминал» в список процессов. Чего вы пытаетесь достичь| grep '[r]oot'
и как это не работает? Вероятно, будет лучшее решение.grep '[t]erminal'
будут совпадать строки, содержащиеterminal
. Вывод изps aux
будет иметь строку сgrep '[t]erminal'
(в квадратных скобках), которая не содержит строкуterminal
(без того же).Используйте pgrep . Это более надежно.
источник
pgrep
не будет работать, если я ищу, например,ps aux | grep 'ssh options'
pgrep -f
?pgrep
сопоставляет только шаблон с именем процесса. Чтобы сопоставить всю команду, используйте-f
флаг.pgrep
возвращает только идентификаторы процесса.pgrep -fl
(но не могли видеть полную строку cmdline без-f
соответствия с полной строкой cmdline, подробности: serverfault.com/a/619788/44183 ). Но да, если вам нужна другая информация, кроме pid, cmdline, вам нужноps
. Можно их объединить:ps -p $(pgrep -f foo)
Этот ответ основан на предыдущем
pgrep
ответе . Он также основан на другом ответе, сочетающем использованиеps
сpgrep
. Вот несколько подходящих примеров обучения:Выше можно использовать как функцию :
Сравните с использованием
ps
сgrep
. Строка полезного заголовка не печатается:источник
-d
возможность указать разделитель; Напримерps -fp$(pgrep -d , getty)
ps uxp `pgrep <process>`
Обратите внимание, чтоp
должен быть последним параметром (то есть,pux
не будет работать)Вы можете фильтровать в команде ps, например,
(или поиск через / proc с find и т. д.)
источник
ps -C <command>
будет соответствовать точной команде. При использовании с опциямиa
илиx
он сообщит обо всех процессах, посколькуa
иx
перечисляет процессы в дополнение к набору процессов, сопоставленных другими способами.logind
дляsystemd-logind
, или в соответствии аргументы.Еще одна альтернатива :
Вот варианты:
источник
-C
вариант уже был предложен в ответе @Andreas Frishe, опубликованном более полутора лет назад ...Использование скобок для окружения символа в шаблоне поиска исключает
grep
процесс, поскольку он не содержит соответствующего регулярного выражения.источник
Отказ от ответственности: я автор этого инструмента, но ...
Я бы использовал px :
Кроме поиска процессов с разумным интерфейсом командной строки, он также делает много других полезных вещей, более подробно на странице проекта .
Работает на Linux и OS X, легко устанавливается:
источник
В зависимости от конечного варианта использования, вы часто предпочитаете Awk.
Это особенно верно, когда у вас есть что-то вроде
где очевидно, что регулярное выражение может быть легко включено в скрипт Awk:
Но на самом деле, не изобретайте это сами.
pgrep
и друзья были вокруг в течение долгого времени и справляются со всем этим проблемным пространством намного лучше, чем большинство специальных повторных воплощений.источник
Другой вариант - отредактировать ваш
.bash_profile
(или другой файл, в котором вы храните псевдонимы bash), чтобы создать функцию, которая удаляет grep из результатов.grep -v grep
Должен быть первым в противном случае ваша--color=auto
воля не работает по какой - то причине.Это работает, если вы используете bash; если вы используете другую оболочку YMMV.
источник
function grep { command grep -v grep | command grep --color=auto "$@"; }
(также обратите внимание на исправление аргумента и цитирование). Однако это нарушается тем, что любой не-ps
вызовgrep
больше не будет работать (аргументы передаются неправильно). Во всяком случае, гораздо более полезная функция будет тот , который изменяет регулярное выражение , чтобы сделать его не совпадать себя, а не отфильтровыватьgrep
изgrep
результатов отдельно. И, конечно, изобретать новые решения проблемы, которая была адекватно решена десятилетия назад, не очень продуктивно.