Что означает символ `|` в оболочке?

16

Что |символ означает в sudo ps -ef | grep processnameкоманде?

Также может кто-нибудь объяснить, пожалуйста, эту команду? Я использовал эту команду только для получения PID и уничтожения этого процесса, но я также видел, sudo ps -ef | grep processname | grep -v grepи у меня сложилось впечатление, что -v grepэто похоже на убийство предыдущего сгенерированного PID для grep. Если это так, как это работает?

Аамир
источник
4
Вам не нужно sudoбежать ps -ef. Также обычная хитрость, чтобы избежать третьей команды, заключает в себе символ имени процесса в квадратных скобках:ps -ef | grep [p]rocessname
kos
1
@kos Эта команда нуждается в кавычках для надежной работы:ps -ef | grep '[p]rocessname'
kasperd
2
@kos Если вы пишете grep [p]rocessname, вы говорите оболочке искать файл в текущем каталоге с именем processnameи заменять шаблон именем этого файла. Если именованный файл не processnameсуществует, оболочка может передать шаблон буквально в grep. Но это зависит от ваших настроек. Так что ваша версия сломается , если файл с именем processnameсуществует , или если любой из следующих вариантов оболочки включен failglob, nullglob, nocaseglob.
kasperd
1
@kasperd Я неправильно прочитал ваш последний комментарий, да, вы правы во всем. Я не учел это.
Кос
1
Я не могу поверить, что это не дубликат.
Мач

Ответы:

13
ps -ef | grep processname

Сначала он запускается sudo ps -efи передает вывод второй команде.

Вторая команда фильтрует все строки, содержащие слово «имя процесса».

ps -ef | grep processname | grep -v grepперечисляет все строки, содержащие processnameи не содержащие grep.

В соответствии с man grep

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

В соответствии с man ps

ps displays information about a selection of the active processes.

-e     Select all processes.  Identical to -A.

-f     Do full-format listing. This option can be combined with many
          other UNIX-style options to add additional columns.  It also
          causes the command arguments to be printed.  When used with -L,
          the NLWP (number of threads) and LWP (thread ID) columns will be
          added.  See the c option, the format keyword args, and the
          format keyword comm.

Вы можете комбинировать параметры -efсредствами так же, как -e -f.

Фактически ps -ef | grep processnameперечислите все вхождения процесса, названного processname.

Pilot6
источник
спасибо за объяснение, что ps -efделает именно ??
Аамир
я думаю, что когда мы запускаем | grep processNameв терминале, мы также получаем вывод grep, который сам по себе является процессом, поэтому -v убивает этот вывод
Aamir
Ты прав.
Pilot6
35

Это называется pipe. Это дает выходные данные первой команды как входные данные для второй команды.

В вашем случае это означает:
результат sudo ps -efподается как входgrep processname

sudo ps -ef:
Здесь перечислены все запущенные процессы. Введите man psтермин для получения дополнительной информации.

grep processname
Итак, этот список процессов подается в grep, который просто ищет программу, определенную programname.

пример

Печатая sudo ps -ef | grep firefoxв моем терминале возвращает:

parto     6501  3081 30 09:12 ?        01:52:11 /usr/lib/firefox/firefox
parto     8295  3081  4 15:14 ?        00:00:00 /usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s web/firefoxbookmarks.scope
parto     8360  8139  0 15:14 pts/24   00:00:00 grep --color=auto firefox
Parto
источник
хорошо, что -V grep, что он делает.
Аамир
хорошее объяснение, но мне нужна помощь о том, как -v grep функционирует ..
Амир
О, я понимаю, почему grep -vиспользуется. Отфильтровать последнюю строку.
Pilot6
@ Аамир Посмотри на мой ответ. grep -vФильтрует OUT строки, содержащие шаблон.
Pilot6
1
Вы также можете добавить, что вы можете использовать несколько каналов. Например, эхо "foobar" | grep foo | grep bar
Michael
7

Я попытаюсь ответить на это прямым практическим ответом:

Труба |позволяет делать потрясающие вещи в оболочке! Это единственный оператор, который я считаю наиболее полезным и мощным.

как насчет подсчета файлов в каталоге? просто:

ls | wc -l..направить вывод параметра lsto wcwit -lдля строк

или подсчет строк в файле?

cat someFile | wc -l

Что делать, если я хочу что-то искать? 'grep' может искать вхождения строк:

cat someFile | grep aRandomStringYouWantToSearchFor

вы просто перенаправляете вывод команды слева от канала в команду справа от канала.

еще один уровень: как часто что-то происходит в файле?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

Вы можете использовать | почти для всего :)

fortune | cowsay

введите описание изображения здесь

Gewure
источник
2
Да, трубы - это весело, +1, но, пожалуйста, измените примеры: UUOC .
Кос
Как: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Сади
ОФК. но в целях простоты ...
автор
1
Откровенно говоря, многие ваши примеры не нуждаются в трубах. Вы слышали о демоггификации? Вы используете cat и pipe, когда многие команды будут напрямую принимать файлы в качестве параметров: например, cat someFile | grep aRandomStringYouWantToSearchFor должен быть grep aRandomStringYouWantToSearchFor someFile
капитан
ребята .. я знаю. если бы вы прочитали комментарии, капитан, вы бы прочитали мой ответ. Парень, который задал вопросы, не поймет РЕАЛЬНЫХ применений трубы - он даже не знает, что такое grep. так я должен дать ему этот пример? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') нет, потому что это не будет служить цели вообще.
Gewure
4

Я использовал эту команду только для получения PID и уничтожения этого процесса

Другие ответы уже ответили на ваш главный вопрос, но я бы хотел ответить и на это;

В общем, уничтожение процесса часто является излишним и оставляет ресурсы, выделенные процессом, в грязном состоянии, его часто можно просто прекратить ;

Кроме того, просто используйте, pkillчтобы убить / завершить процесс. pkillподдерживает указание точного имени процесса или регулярного выражения:

pkill -x foo # Terminates process foo
pkill ^foo$ # Terminates process foo
pkill -9 -x foo # Kills process foo
pkill -9 ^foo$ # Kills process foo
кос
источник
1
Не используйте, kill -9если вы не знаете, что никакой другой сигнал не будет работать. См. Также iki.fi/era/unix/award.html#kill
tripleee
@tripleee OP заявил, что они хотят убить процесс, хотя.
Кос
Вот что killделает. Указание -9является дополнительной и чаще всего катастрофической дополнительной опцией.
tripleee
@tripleee Я думаю, что путаница возникает из-за терминологии; для меня убить = SIGKILL, а не SIGTERM.
Кос
Для большинства людей я ожидал бы, что «убить» будет означать kill, ясно и просто. Если не принимать -9во внимание ни одну терминологию, ваш ответ не должен советовать людям использовать эту опцию, если вы не указали грубую оговорку.
tripleee