Mam dziwny problem związany z grep -v
zapytaniami. Pozwól mi wyjaśnić:
Do wyświetlania połączeń używam 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)
Obecny tty
mój terminal topts/0
$ tty
/dev/pts/0
$ tty | cut -f3-4 -d'/'
pts/0
Próbuję wykluczyć własne połączenie za pomocą grep -v $(tty | cut -f3-4 -d'/')
. Oczekiwany wynik tego polecenia powinien być who
bez mojego połączenia. Jednak wynik jest najbardziej nieoczekiwany:
$ who | grep -v $(tty | cut -f3-4 -d'/')
grep: a: No such file or directory
grep: tty: No such file or directory
Załączam $(...)
cytaty i wydaje się, że to rozwiązuje problem „Brak takiego pliku lub katalogu”. Jednak moje połączenie jest nadal drukowane, mimo że moja tty ( pts/0
) powinna zostać wykluczona:
$ 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)
W tej chwili nie mam pojęcia, dlaczego grep
zapytanie działa nieprawidłowo.
command-line
grep
tty
być może może być
źródło
źródło
set -x
najpierw użyjesz ... Następnie uruchom polecenie i zobacz, co tak naprawdę próbujeszgrep
...grep
„nie jestem tty”. Jak sugerowałbyś, żebym to obejść?Odpowiedzi:
Zachary wyjaśnił źródło problemu.
Możesz z tym obejść
Byłoby to niewłaściwe, ponieważ na przykład, jeśli ten tty jest
pts/1
, ostatecznie wykluczasz wszystkie wiersze zawierającepts/10
. Niektóregrep
implementacje mają-w
opcję wyszukiwania słównie pasowałoby,
pts/10
ponieważ popts/1
nim nie następuje znak inny niż słowo.Albo można użyć
awk
do filtra od dokładnej wartości drugiego pola jak:Jeśli chcesz to zrobić za pomocą jednego polecenia:
Oryginalny stdin jest powielany na deskryptorze pliku 3 i przywracany dla
tty
polecenia.źródło
tty | cut -f3-4 -d'/' | xargs -I % sh -c "who | grep -v %"
Ze strony informacyjnej tty.
Problem polega na tym, że w twoim przykładzie sttyna tty to rura, a nie terminal.
Możesz zobaczyć z tego przykładu.
Aby obejść ten problem, możesz zrobić coś takiego.
Jest szybszy / bardziej wydajny sposób, jednak wymaga dwóch poleceń.
źródło
who | grep -v "$(ps ax | grep "^$$" | awk '{ print $2 }')"
produkuje oczekiwany wynik na moim urządzeniu it=$(tty) who|grep -v "${t:5}"
nie produkuje nic.GNU bash, version 4.1.2
ps ax | grep "^ *$$"
może fałszować np. twoja powłoka to 123 i istnieje 1234;ps ax -otty= $$
jest bardziej solidny i tylko jeden proces. Ale wolę twój${t:5}
lub Stephane'a${t#/dev/}
(lubsubstr(t,6)
)