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

16

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

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

    
задан Aamir 01.12.2015 в 12:11
источник

4 ответа

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 01.12.2015 в 12:17
источник
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 01.12.2015 в 12:14
7

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

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

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

ls | wc -l ..отправляет вывод ls в wc wit параметр -l для строк

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

cat someFile | wc -l

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

cat someFile | grep aRandomStringYouWantToSearchFor

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

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

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

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

fortune | cowsay

    

ответ дан Gewure 01.12.2015 в 15:57
4
  

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

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

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

Кроме того, просто используйте 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
    
ответ дан kos 01.12.2015 в 12:40