Ich habe ein seltsames Problem im Zusammenhang mit grep -v
Abfragen. Lassen Sie mich erklären:
So zeigen Sie Verbindungen an, die ich verwende who
:
$ who
harry pts/0 2016-12-08 20:41 (192.168.0.1)
james pts/1 2016-12-08 19:28 (192.168.0.1)
timothy pts/2 2016-12-08 02:44 (192.168.0.1)
Der Strom tty
meines Terminals istpts/0
$ tty
/dev/pts/0
$ tty | cut -f3-4 -d'/'
pts/0
Ich versuche meine eigene Verbindung mit auszuschließen grep -v $(tty | cut -f3-4 -d'/')
. Die erwartete Ausgabe dieses Befehls sollte who
ohne meine Verbindung sein. Die Ausgabe ist jedoch höchst unerwartet:
$ who | grep -v $(tty | cut -f3-4 -d'/')
grep: a: No such file or directory
grep: tty: No such file or directory
Ich füge die $(...)
in Anführungszeichen und das scheint das Problem "Keine solche Datei oder Verzeichnis" zu beheben. Meine Verbindung wird jedoch weiterhin gedruckt, obwohl mein tty ( pts/0
) hätte ausgeschlossen werden sollen:
$ who | grep -v "$(tty | cut -f3-4 -d'/')"
harry pts/0 2016-12-08 20:41 (192.168.0.1)
james pts/1 2016-12-08 19:28 (192.168.0.1)
timothy pts/2 2016-12-08 02:44 (192.168.0.1)
Zum jetzigen Zeitpunkt habe ich absolut keine Ahnung, warum die grep
Abfrage fehlerhaft ist.
command-line
grep
tty
vielleicht doch
quelle
quelle
set -x
zuerst mit ... Dann führen Sie Ihren Befehl und sehen, was Sie tatsächlich versuchengrep
...grep
"kein bisschen" bin . Wie würden Sie vorschlagen, dass ich das umgehen soll?Antworten:
Zachary hat die Ursache des Problems erklärt.
Während Sie damit umgehen können
Das wäre falsch, zum Beispiel, wenn das tty ist
pts/1
, würden Sie am Ende alle Zeilen ausschließen, die enthaltenpts/10
. Einigegrep
Implementierungen haben die-w
Option, eine Wortsuche durchzuführenwürde nicht mit on übereinstimmen,
pts/10
da dempts/1
in dort kein Nicht-Wort-Zeichen folgt.Oder Sie können
awk
den genauen Wert des zweiten Feldes wie folgt filtern:Wenn Sie es in einem Befehl tun möchten:
Das ursprüngliche stdin wird auf Dateideskriptor 3 dupliziert und für den
tty
Befehl wiederhergestellt .quelle
tty | cut -f3-4 -d'/' | xargs -I % sh -c "who | grep -v %"
Von der tty info Seite.
Das Problem ist, dass in Ihrem Beispiel tty stdin eine Pipe ist, nicht Ihr Terminal.
Sie können aus diesem Beispiel sehen.
Um das zu umgehen, könnten Sie so etwas tun.
Es gibt eine schnellere / effizientere Methode, für die jedoch zwei Befehle erforderlich sind.
quelle
who | grep -v "$(ps ax | grep "^$$" | awk '{ print $2 }')"
produziert die erwartete Ausgabe auf meiner Box undt=$(tty) who|grep -v "${t:5}"
produziert nichts.GNU bash, version 4.1.2
ps ax | grep "^ *$$"
könnte falsch übereinstimmen, z. B. ist Ihre Shell 123 und 1234 existiert;ps ax -otty= $$
ist robuster und nur ein Prozess. Aber ich bevorzuge deine${t:5}
oder Stephanes${t#/dev/}
(odersubstr(t,6)
)