Когда я ищу какой-то процесс, который не существует, например,
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
Очевидно, меня не волнует grep - в этом столько же смысла, сколько и в поиске ps
процесса!
Как я могу предотвратить появление grep в результатах?
ps aux |grep
наpgrep
(илиpgrep -f
).ps aux
, я ожидаю). Таким образом, вопрос заключается в том, как предотвратить появлениеgrep fnord
в качестве запущенного процесса, потому что, очевидно, я не заинтересован в этом .Ответы:
Оказывается, есть решение, найденное в связке ключей .
Поставив квадратные скобки вокруг буквы и кавычки вокруг строки, вы ищете регулярное выражение, которое говорит: «Найдите символ« f », за которым следует« nord »».
Но поскольку вы поставили квадратные скобки в шаблоне, за «f» теперь следует «]», поэтому
grep
в списке результатов не будет отображаться. Neato!источник
grep [f]nord
. Однако эта строка не будет проходить через фильтр grep, поскольку строка[f]nord
не соответствует регулярному выражению[f]nord
.ps aux | grep fnord | grep -v grep
... что, кажется, уже было предложено несколькими людьми ... LOL[
даже в bash. Попробуйте это с файлом, который называетсяfnord
в текущем каталоге.ps
может быть старой уловкой, но это ненадежно. Используйте,pgrep
если доступно.fnord
программы и называется программаsafnorde
. Или есть пользователь по имениbfnord
, и вы в конечном итоге убиваете все его процессы. И т.д.Другой вариант, который я использую (особенно для проверки, запущен ли процесс), - это
pgrep
команда. Это будет искать соответствующий процесс, но не будет отображать строку поиска для поиска. Мне это нравится, потому что это быстрый способ поиска, без регулярных выражений или экранирования.источник
-f
опция была больше похожаps | grep
.pgrep -f
будет выглядеть больше какps -f | grep
.-l
аргумент, чтобы показать команду, которая соответствует.ps | grep '[f]nord'
умный и почтенный, но pgrep прав .ps $(pgrep cmd) ...
если в `pgrep отсутствуют параметры (хотя он не будет работать для пустого набора команд).Идеальным решением является решение, представленное BriGuy
Но если вы не хотите этого делать, вы можете просто исключить все строки, совпадающие с grep :
источник
pgrep
или найти другое;)Не самое элегантное решение, но вы можете сделать это:
$ ps aux | grep fnord | grep -v grep
источник
grep
в твоей фразе было слово . Это не покажет этот процесс. Например, предположим, что вызванный файлfoo_grep_bar.txt
редактируетсяnano
командой. Итак, процесс запущен:root 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txt
согласно этому ответу это не будет работать:$ ps aux | grep nano | grep -v grep
потому что в вашем имени файла есть слово grep.grep fnord
не толькоgrep
то есть$ ps aux | grep fnord | grep -v "grep fnord"
В зш
grep fnord =(ps aux)
.Идея состоит в том, чтобы сначала запустить
ps aux
результат в файл, а затем использовать егоgrep
. Только у нас нет файла, так как мы используем zsh «процесс подстановки».Для иллюстрации попробуйте
Результат должен быть таким же.
Общие комментарии по некоторым другим ответам. Некоторые из них далеко сложны и / или долго печатать. Дело не только в том, чтобы быть правым, но и в том, чтобы его можно было использовать. Но это не значит, что некоторые из этих решений плохие; только для того, чтобы их можно было использовать, они должны быть заключены в мини-интерфейс.
источник
<(command)
.grep grep =(ps aux)
не показывает ни одной строки.print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
источник
| grep $(echo fnord)
было недостаточно? Вы также просите Sed искать и заменять каждый символ в "fnord" его собственным значением? ^^ поздравляю. Могу поспорить, что могу сделать еще дольше, но, вероятно, это будет не так смешно ^^ps aux | grep '[^]]fnord'
бы избежать этой гимнастики.Поиск процессов
Если вы просто ищете
fnord
процессы, вы можете использовать-C
опцию для выбора по имени команды:Это может быть смешано с опциями формата в стиле BSD и POSIX. Смотрите man-страницу ps для полного списка.
Ищете что-то еще?
Если вам нужно что-то более сложное, чем точный поиск имени команды, не теряйте надежды! Это все еще можно сделать на
ps
стороне трубы. Все, что нам нужно сделать, это сказать,ps
чтобы исключитьgrep
процессы из результата:-C grep
выбирает все процессы grep и-N
отменяет выбор. Это может быть использовано для поиска аргументов команды, части имени команды или более сложных регулярных выражений.источник
ps
но-C
не определено POSIX и имеет совершенно другое значение для BSDМой ответ - это вариант типичного ответа для поиска «foobar» в списке «ps». Я считаю, что аргумент «-A» «ps» более переносим, чем «aux», но это изменение не имеет отношения к ответу. Типичный ответ выглядит так:
Вместо этого я использую этот шаблон:
Основное преимущество заключается в том, что на основе этих шаблонов легче писать сценарии, поскольку вы просто объединяете статическую строку «[^]]» с любым шаблоном, который ищете. Вам не нужно удалять первую букву строки, затем вставлять ее между квадратными скобками, а затем снова объединять ее. При создании сценариев в оболочке проще просто вставить «[^]]» перед шаблоном, который вы искали. Разрезание строк в Bash - отвратительная вещь, поэтому мой вариант этого избегает. Этот вариант говорит о том, что показывают линии, в которых шаблон соответствует БЕЗ ведущей правой квадратной скобки]. Поскольку шаблон поиска для исключения квадратной скобки фактически добавляет квадратную скобку к шаблону, он никогда не будет совпадать сам по себе.
Таким образом, вы можете написать переносимую команду psgrep следующим образом. Здесь я делаю некоторые различия между Linux, OS X BSD и другими. Это добавляет заголовки столбцов из «ps», предоставляет более настраиваемый формат «ps», который лучше подходит для моих нужд, и отображает процессы, перечисляющие дополнительные, очень широкие, чтобы ни один из аргументов командной строки не был пропущен. Ну, большинство не пропустили. Java - это Java, она часто работает в наихудшем из возможных способов, поэтому некоторые java-сервисы будут работать с максимально допустимой длиной аргументов, которую будет отслеживать таблица процессов. Я считаю, что это 1024 символов. Длина в одиночку, позволяющая запустить процесс, намного длиннее, но таблица процессов ядра не заботится о том, чтобы отслеживать что-то более 1 КБ. После запуска команды имя-команды и список аргументов isn '
источник
Самый простой способ сделать это без использования оболочки - сначала сохранить его в переменной:
Вызов:
grep fnord =(ps aux)
ответ @ EmanuelBerg - самый элегантный, хотя и требуетzsh
. Я кратко имел это в моих файлах rc, но bash жалуется на этот синтаксис даже несмотря на условие, которое должно помешать его оценке.Из моих файлов RC у меня есть версия без учета регистра, которая принимает аргументы grep:
Прогулка по коду, одна пуля на строку кода:
ps
вывод (вlocal
переменной, чтобы она исчезла, когда функция вернется)$PS_OUTPUT
и удалите все после первого перевода строки (регулярное выражение:)s/\n.*$//msg
. Это мешает нам получить названиеps
выходные данные со всем, кроме первой строки (regex эквивалента:)s/^.*\n//m
и grep с его содержимым-i
для учета без учета регистра и со всеми аргументами, переданными этой функции (в случае отсутствия аргументов^
, что соответствует началу любой строки, чтобы соответствовать все)источник
Вот расширенная версия
grep -v grep
решения, отфильтровывающая всеgrep
процессы, которые не выполнялись более секунды, что является улучшением по сравнению с «просто отбрасывать все вхожденияgrep
».соответственно
Это может быть не переносимым и зависит от фактического формата вывода вашей локальной
ps
команды.Вы можете объединить это с цветным
grep
выводом для удобства:источник
Может быть, пришло время использовать реальную последовательность на этот раз. Использование труб делает его параллельным.
Ужасно, потому что будет файл
f
, но я не виноват, что нет синтаксиса для последовательных процессов, где вы все еще хотите использовать выходные данные ранее запущенного процесса.Предложение по синтаксису последовательного оператора:
источник
ps
выходные данныеgrep
, я использую больше памяти (или диска) дольше.Команда pgrep, как уже говорили другие, вернет PID (ID процесса) процессов на основе имени и других атрибутов. Например,
предоставит вам PID, разделенные запятой (,) всех процессов, чьи имена соответствуют запускаемым пользователем
<username>
. Вы можете использовать ключ -x, прежде чем возвращать только точные совпадения.Если вы хотите получить больше информации об этих процессах (как подразумевается при запуске опций aux из ps), вы можете использовать опцию -p с ps, которая соответствует на основе PID. Так, например,
выдаст подробную информацию обо всех идентификаторах PID, соответствующих команде pgrep.
источник
ps
терпит неудачу, еслиpgrep
возвращает пустой набор. У меня есть ответ, который опирается на ваш и пытается решить эту проблему.Вот простой пример, чтобы найти PID
ssh-agent
для имени пользователя, не показывая PID самогоgrep
процесса:Если вы хотите, например, убить
ssh-agent
для текущего пользователя, вы можете использовать следующую команду:Чтобы создать удобный псевдоним, добавьте в файл ~ / .bashrc или ~ / .zshrc следующий код:
И использование псевдонима здесь - примеры, чтобы заставить всех изучать регулярные выражения:
PS Я тестировал эти команды только в Ubuntu и Gentoo.
источник
"${USER}.* /usr/bin/ssh-agent"
. Это работает, потому что вы сказали[ ]
; т.е. вы просто используете механизм принятого ответа. Вы могли бы также простоgrep "[s]sh-agent"
.Использование опции -x (точное совпадение) сработало для меня. Я объединил его с -f (полная командная строка), чтобы я мог точно сопоставить свой процесс с:
источник
Вы можете сделать это легко, просто с помощью определения ALIAS в вашем
.bashrc
виде:источник
grep
использование в других случаях. Попробуйecho I love grep | grep love
.