Яке значення символу `|` в оболонці?


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існує, оболонка може передавати шаблон буквально в режим грепінгу. Але це залежить від ваших налаштувань. Так що ваша версія зламається , якщо файл з ім'ям 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.


дякую за пояснення, що ps -efробить саме ??
Аамір

я думаю, коли ми запускаємося | grep processNameв терміналі, ми також отримуємо вихід grep, який сам по собі є процесом, тому -v вбиває цей вихід
Аамір

Ви праві.
Пілот6

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

добре, що -v греп, що це робить.
Аамір

гарне пояснення, але мені потрібна допомога щодо -v grep функціонування ..
Аамір

О, я бачу, чому grep -vвикористовується. Щоб відфільтрувати останній рядок.
Пілот6

@Aamir Дивіться мою відповідь. grep -vфільтрує лінії OUT, що містять візерунок.
Пілот6

1
Ви також можете додати, що ви можете використовувати декілька труб. Наприклад, відлуння "foobar" | греп фу | grep bar
Майкл

7

Я спробую відповісти на це прямолінійною практичною відповіддю:

Труба |дозволяє вам робити приголомшливі речі в оболонці! Це єдиний оператор, який я вважаю найбільш корисним і могутнім.

як щодо підрахунку файлів у каталозі? просто:

ls | wc -l..redirect виходу lsдля wcпараметра дотепності -lдля ліній

або підрахунок рядків у файлі?

cat someFile | wc -l

Що робити, якщо я хочу щось шукати? 'grep' може шукати виникнення рядків:

cat someFile | grep aRandomStringYouWantToSearchFor

Ви просто перенаправляєте висновок команди зліва від Труби на команду праворуч від труби.

ще один рівень: як часто щось відбувається у файлі?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

ви можете використовувати | майже для всього :)

fortune | cowsay

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


2
Так, труби - це весело, +1, але будь ласка, змініть приклади: UUOC .
kos

Як: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Саді

офс. але з метою простоти ...
власник

1
Відверто кажучи, багато ваших прикладів не потребують труби. Ви чули про демогігіфікацію? Ви використовуєте cat і pipe, коли багато команд приймуть файли безпосередньо як параметри: напр. Cat someFile | grep aRandomStringYouWantToSearchFor має бути grep aRandomStringYouWantToSearch for someFile
Капітан Лептон

хлопці .. я знаю. якби ти прочитав коментарі, капітане, ви б прочитали мою відповідь. Хлопець, який задав питання, не зрозуміє РЕАЛЬНІ додатки труби - він навіть не знає, що таке греп. тож я мушу навести йому цей приклад? 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 заявив, що хочуть вбити процес.
kos

Ось що і killробить. Вказання -9- це додатковий і найчастіше катастрофічний додатковий варіант.
трійка

@tripleee Я вважаю, що плутанина виникає через термінологію; мені вбити = SIGKILL, а не SIGTERM.
kos

Для більшості людей я б очікував, що "вбити" означатиме killпросто і просто. Будь-яка термінологія осторонь, ваша відповідь не повинна радити людям користуватися цим -9варіантом, якщо ви не вкладаєте м'ясний застереження.
трійчатка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.