Was bedeutet das Symbol "|" in der Shell?

16

Was bedeutet das |Symbol im sudo ps -ef | grep processnameBefehl?

Kann auch jemand bitte diesen Befehl erklären? Ich habe diesen Befehl nur zum Abrufen der PID und zum Beenden dieses Prozesses verwendet, aber ich habe auch gesehen, sudo ps -ef | grep processname | grep -v grepund ich habe den Eindruck, als würde -v grepman die zuvor generierte PID für beenden grep. Wenn ja, wie geht das?

Aamir
quelle
4
Du musst nicht sudorennen ps -ef. Ein weiterer Trick, um den dritten Befehl zu umgehen, besteht darin, ein Zeichen des Prozessnamens in eckige Klammern zu setzen:ps -ef | grep [p]rocessname
kos
1
@kos Dieser Befehl benötigt Anführungszeichen, um zuverlässig zu funktionieren:ps -ef | grep '[p]rocessname'
Kasperd
2
@kos Wenn Sie schreiben grep [p]rocessname, fordern Sie die Shell auf, im aktuellen Verzeichnis nach einer Datei mit dem Namen zu suchen processnameund das Muster durch den Namen dieser Datei zu ersetzen. Wenn keine Datei mit dem Namen processnameexistiert, kann die Shell das Muster wörtlich an grep übergeben. Das hängt aber von deinen Einstellungen ab. So Ihre Version brechen wird , wenn eine Datei mit dem Namen processnameexistiert oder wenn eine der folgenden Shell - Optionen aktiviert wurde failglob, nullglob, nocaseglob.
Kasperd
1
@kasperd Ich habe deinen letzten Kommentar falsch gelesen, ja, du hast in allem Recht. Das habe ich nicht bedacht.
Kos
1
Ich kann nicht glauben, dass dies kein Duplikat ist.
Mast

Antworten:

13
ps -ef | grep processname

Es wird zuerst ausgeführt sudo ps -efund die Ausgabe an den zweiten Befehl übergeben.

Der zweite Befehl filtert alle Zeilen, die das Wort "processname" enthalten.

ps -ef | grep processname | grep -v greplistet alle Zeilen auf, die enthalten processnameund nicht enthalten grep.

Gemäß man grep

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

Gemäß 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.

Sie können Parameter -efwie folgt kombinieren -e -f.

ps -ef | grep processnameListen Sie tatsächlich alle Vorkommen des aufgerufenen Prozesses auf processname.

Pilot6
quelle
danke für erklärung, was macht ps -efdas genau ???
Aamir,
Ich denke, wenn wir | grep processNameim Terminal laufen, bekommen wir auch die Ausgabe von grep, was selbst ein Prozess ist, so dass -v diese Ausgabe beendet
Aamir
Du hast Recht.
Pilot6
35

Es heißt pipe. Es gibt die Ausgabe des ersten Befehls als Eingabe für den zweiten Befehl.

In Ihrem Fall bedeutet dies:
Das Ergebnis von sudo ps -efwird als Eingabe von eingespeistgrep processname

sudo ps -ef:
Hier werden alle laufenden Prozesse aufgelistet. Geben Sie man psim Terminal ausgeben für mehr.

grep processname
Diese Liste von Prozessen wird also in grep eingespeist, das nur nach dem durch definierten Programm sucht programname.

Beispiel

Das Eingeben sudo ps -ef | grep firefoxmeines Terminals gibt Folgendes zurück:

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
quelle
ok, was -v grep, was macht es?
Aamir,
Gute Erklärung, aber ich brauche etwas Hilfe, wie -v grep funktioniert ..
Aamir
Oh, ich verstehe, warum grep -vverwendet wird. Die letzte Zeile herausfiltern.
Pilot6
@Aamir Siehe meine Antwort. grep -vfiltert OUT-Zeilen mit Pattern.
Pilot6
1
Sie können auch hinzufügen, dass Sie mehrere Pipes verwenden können. ZB Echo "foobar" | grep foo | grep bar
Michael
7

Ich werde versuchen, dies mit einer einfachen praktischen Antwort zu beantworten:

Mit der Pfeife |kannst du tolle Sachen in der Muschel machen! Es ist der einzige Operator, den ich für den nützlichsten und mächtigsten halte.

Wie wäre es mit dem Zählen von Dateien in einem Verzeichnis? einfach:

ls | wc -l..redirect die Ausgabe des Parameters lsto wcwit -lfür Zeilen

oder Zählen von Zeilen in einer Datei?

cat someFile | wc -l

was ist, wenn ich etwas suchen will? 'grep' kann nach Vorkommen von Strings suchen:

cat someFile | grep aRandomStringYouWantToSearchFor

Sie leiten einfach die Ausgabe des Befehls links von der Pipe auf den Befehl rechts von der Pipe um.

eine weitere Ebene: Wie oft kommt etwas in einer Datei vor?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

Sie können das | verwenden für fast alles :)

fortune | cowsay

Bildbeschreibung hier eingeben

Gewure
quelle
2
Ja, Pipes machen Spaß, +1, aber bitte ändern Sie die Beispiele: UUOC .
Kos
Like: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Sadi
ofc. aber der Einfachheit halber ... der Fragesteller scheint nicht tiefer in grep zu sein, zB :)
Gewure
1
Ehrlich gesagt benötigen viele Ihrer Beispiele keine Rohre. Hast du von Demoggification gehört? Sie verwenden cat and pipe, wenn viele Befehle die Dateien direkt als Parameter verwenden: zB cat someFile | grep aRandomStringYouToSearchFor sollte grep aRandomStringYouToSearchFor someFile sein
Captain Lepton
Jungs .. ich weiß. Wenn Sie die Kommentare gelesen hätten, Captain, hätten Sie meine Antwort gelesen. Der Typ, der die Fragen gestellt hat, versteht die REAL-Anwendungen der Pipe nicht - er weiß nicht einmal, was grep ist. Soll ich ihm dieses Beispiel geben? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') nein, denn es würde überhaupt nicht dem Zweck dienen.
Gewure
4

Ich habe diesen Befehl nur verwendet, um die PID zu ermitteln und diesen Prozess zu beenden

Andere Antworten haben Ihre Hauptfrage bereits beantwortet, aber ich möchte auch darauf eingehen.

Im Allgemeinen Tötung ist ein Prozess oft zuviel des Guten und Blätter von einem Prozess zugewiesenen Ressourcen um in einem chaotischen Zustand, können Sie oft nur beenden es;

Verwenden Sie außerdem nur pkill, um einen Prozess abzubrechen / zu beenden. pkillunterstützt die Angabe eines genauen Prozessnamens oder eines regulären Ausdrucks:

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
quelle
1
Verwenden kill -9Sie diese Option nur, wenn Sie genau wissen, dass kein anderes Signal funktioniert. Siehe auch iki.fi/era/unix/award.html#kill
tripleee
@tripleee OP erklärte sie wollen töten , obwohl der Prozess.
Kos
Das ist was killtut. Das Angeben -9ist eine zusätzliche und häufig katastrophale zusätzliche Option.
Tripleee
@ Tripleee Ich glaube, die Verwirrung entsteht aufgrund der Terminologie; für mich kill = SIGKILL, nicht SIGTERM.
Kos
Für die meisten Leute würde ich erwarten, dass "töten" killschlicht und einfach bedeutet. Abgesehen von jeglicher Terminologie sollte Ihre Antwort den Leuten nicht raten, diese -9Option zu verwenden, es sei denn, Sie haben eine fleischige Einschränkung eingeführt.
Tripleee