Jakie jest znaczenie symbolu `|` w powłoce?

16

Co |symbol oznacza w sudo ps -ef | grep processnamepoleceniu?

Czy ktoś może również wyjaśnić to polecenie? Użyłem tego polecenia tylko do uzyskania PID i zabicia tego procesu, ale widziałem sudo ps -ef | grep processname | grep -v grepi mam wrażenie, że -v grepto jak zabicie wcześniej wygenerowanego PID grep. Jeśli tak, jak to działa?

Aamir
źródło
4
Nie musisz sudobiec ps -ef. Powszechną sztuczką pozwalającą uniknąć trzeciego polecenia jest umieszczenie znaku nazwy procesu w nawiasach kwadratowych:ps -ef | grep [p]rocessname
kos
1
@kos Ta komenda potrzebuje cudzysłowów, aby działać niezawodnie:ps -ef | grep '[p]rocessname'
kasperd
2
@kos Jeśli piszesz grep [p]rocessname, mówisz powłoce, aby szukała pliku w bieżącym katalogu o nazwie processnamei zastąpiła wzorzec nazwą tego pliku. Jeśli żaden plik o nazwie nie processnameistnieje, powłoka może przekazać wzór dosłownie do grep. Ale to zależy od twoich ustawień. Więc twoja wersja pęknie jeśli plik o nazwie processnameistnieje, lub jeśli któryś z poniższych opcji powłoki została włączona failglob, nullglob, nocaseglob.
kasperd
1
@kasperd Źle odczytałem twój ostatni komentarz, tak, masz rację co do wszystkiego. Nie brałem tego pod uwagę.
Kos
1
Nie mogę uwierzyć, że to nie jest duplikat.
Maszt

Odpowiedzi:

13
ps -ef | grep processname

Najpierw uruchamia się sudo ps -efi przekazuje dane wyjściowe do drugiego polecenia.

Drugie polecenie filtruje wszystkie wiersze zawierające słowo „nazwa procesu”.

ps -ef | grep processname | grep -v grepwyświetla wszystkie linie zawierające processnamei nie zawierające grep.

Według man grep

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

Według 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.

Możesz łączyć parametry -eftak samo jak -e -f.

Właściwie ps -ef | grep processnamewypisz wszystkie wystąpienia wywoływanego procesu processname.

Pilot 6
źródło
dzięki za wyjaśnienie, co ps -efdokładnie robi ??
Aamir,
myślę, że kiedy uruchamiamy | grep processNamew terminalu, otrzymujemy również wyjście grep, które samo w sobie jest procesem, więc -v zabija to wyjście
Aamir
Masz rację.
Pilot6
35

To się nazywa pipe. Daje wynik pierwszego polecenia jako dane wejściowe drugiego polecenia.

W twoim przypadku oznacza to:
Wynik sudo ps -efpodawany jest jako dane wejściowegrep processname

sudo ps -ef:
Zawiera listę wszystkich uruchomionych procesów. Wpisz man pstermin, aby uzyskać więcej.

grep processname
Tak więc ta lista procesów jest wprowadzana do grep, który tylko wyszukuje program zdefiniowany przez programname.

Przykład

Wpisanie sudo ps -ef | grep firefoxw moim terminalu zwraca:

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
źródło
ok, co -v grep, co to robi.
Aamir,
dobre wyjaśnienie, ale potrzebuję pomocy, jak -v grep działa ..
Aamir
Och, rozumiem, dlaczego grep -vjest używany. Aby odfiltrować ostatni wiersz.
Pilot6
@Airir Zobacz moją odpowiedź. grep -vodfiltrowuje linie zawierające wzór.
Pilot6
1
Możesz także dodać, że możesz używać wielu potoków. Np. Echo „foobar” | grep foo | grep bar
Michael
7

Spróbuję odpowiedzieć na to z prostą praktyczną odpowiedzią:

Fajka |pozwala robić niesamowite rzeczy w skorupce! To jedyny operator, który uważam za najbardziej użyteczny i potężny.

co powiesz na zliczanie plików w katalogu? prosty:

ls | wc -l..redirect wyjście lsdo wcparametru wit -ldla linii

lub zliczanie linii w pliku?

cat someFile | wc -l

co jeśli chcę czegoś szukać? „grep” może wyszukiwać wystąpienia ciągów:

cat someFile | grep aRandomStringYouWantToSearchFor

po prostu przekieruj wyjście polecenia po lewej stronie potoku do polecenia po prawej stronie potoku.

jeszcze jeden poziom: jak często coś występuje w pliku?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

możesz użyć | na prawie wszystko :)

fortune | cowsay

wprowadź opis zdjęcia tutaj

Gewure
źródło
2
Tak, fajki są fajne, +1, ale zmień przykłady: UUOC .
Kos
Jak: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Sadi,
ofc. ale dla uproszczenia ... pytający nie wydaje się być głębszy w grep, np. :)
Gewure
1
Szczerze mówiąc, wiele z twoich przykładów nie potrzebuje rur. Czy słyszałeś o demoggifikacji? Używasz cat i pipe, gdy wiele poleceń pobierze pliki jako parametry bezpośrednio: np. Cat someFile | grep aRandomStringYouWantToSearchFor powinien być grep aRandomStringYouWantToSearchFor someFile
Captain Lepton
chłopaki .. wiem. jeśli przeczytacie komentarze, kapitanie, przeczytalibyście moją odpowiedź. Facet, który zadał pytania, nie zrozumie PRAWDZIWYCH zastosowań rurki - nawet nie wie, co to jest grep. czy mam mu dać ten przykład? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') nie, bo to w ogóle by nie służyło.
Gewure,
4

Użyłem tego polecenia tylko do uzyskania PID i zabicia tego procesu

Inne odpowiedzi już odpowiedziały na twoje główne pytanie, ale chciałbym również na to odpowiedzieć;

Zasadniczo zabicie procesu jest często przesadą i pozostawia zasoby przydzielone przez proces w chaotycznym stanie, często możesz po prostu go zakończyć ;

Oprócz tego wystarczy użyć pkilldo zabicia / zakończenia procesu. pkillobsługuje określenie dokładnej nazwy procesu lub wyrażenia regularnego:

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
źródło
1
Nie używaj, kill -9chyba że wiesz, że żaden inny sygnał nie zadziała. Zobacz także iki.fi/era/unix/award.html#kill
tripleee
@tripleee OP stwierdził jednak, że chce zabić ten proces.
Kos
Właśnie to killrobi. Określenie -9to dodatkowa i najczęściej katastrofalna dodatkowa opcja.
tripleee
@tripleee Wierzę, że zamieszanie powstaje z powodu terminologii; dla mnie kill = SIGKILL, nie SIGTERM.
Kos
Dla większości ludzi spodziewałbym się, że „zabijanie” będzie killproste, proste. Niezależnie od terminologii, twoja odpowiedź nie powinna doradzać ludziom korzystania z tej -9opcji, chyba że podasz mięsne zastrzeżenie.
tripleee