J'ai un problème étrange lié aux grep -v
requêtes. Permettez-moi d'expliquer:
Pour afficher les connexions que j'utilise 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)
Le courant tty
de mon terminal estpts/0
$ tty
/dev/pts/0
$ tty | cut -f3-4 -d'/'
pts/0
J'essaie d'exclure ma propre connexion en utilisant grep -v $(tty | cut -f3-4 -d'/')
. La sortie attendue de cette commande devrait être who
, sans ma connexion. Cependant, la sortie est la plus inattendue:
$ who | grep -v $(tty | cut -f3-4 -d'/')
grep: a: No such file or directory
grep: tty: No such file or directory
Je joins les $(...)
guillemets et cela semble résoudre le problème "Aucun fichier ou répertoire". Cependant, ma connexion est toujours imprimée même si mon tty ( pts/0
) aurait dû être exclu:
$ 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)
À partir de ce point, je n'ai absolument aucune idée pourquoi la grep
requête fonctionne mal.
command-line
grep
tty
peut-être peut-être
la source
la source
set -x
abord ... Ensuite, exécutez votre commande et voyez ce que vous essayez réellement de fairegrep
...grep
"pas un tty". Comment suggéreriez-vous que je contourne cela?Réponses:
Zachary a expliqué la source du problème.
Bien que vous puissiez contourner ce problème avec
Ce serait faux car, par exemple, si ce tty est
pts/1
, vous finirez par exclure toutes les lignes contenantpts/10
. Certainesgrep
implémentations ont une-w
option pour faire une recherche de motsne correspondrait pas
pts/10
parce que le caractèrepts/1
in there n'est pas suivi d'un caractère autre qu'un mot.Ou vous pouvez utiliser
awk
pour filtrer la valeur exacte du deuxième champ comme:Si vous voulez le faire en une seule commande:
Le stdin d'origine étant dupliqué sur le descripteur de fichier 3 et restauré pour la
tty
commande.la source
tty | cut -f3-4 -d'/' | xargs -I % sh -c "who | grep -v %"
Depuis la page d'informations tty.
Le problème est que dans votre exemple, le stdin de tty est un tube, pas votre terminal.
Vous pouvez voir sur cet exemple.
Pour contourner cela, vous pourriez faire quelque chose comme ça.
Il existe un moyen plus rapide / plus efficace, mais il nécessite deux commandes.
la source
who | grep -v "$(ps ax | grep "^$$" | awk '{ print $2 }')"
produit la sortie attendue sur ma boîte ett=$(tty) who|grep -v "${t:5}"
ne produit rien.GNU bash, version 4.1.2
ps ax | grep "^ *$$"
pourrait fausser la correspondance, par exemple votre shell est 123 et 1234 existe;ps ax -otty= $$
est plus robuste et un seul processus. Mais je préfère le vôtre${t:5}
ou celui de Stéphane${t#/dev/}
(ousubstr(t,6)
)