Odpowiedzi:
Możesz to zrobić za pomocą opcji -v
(for --invert-match
) grep jako:
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file
odfiltruje linie, które mają unwanted_word
i grep XXXXXXXX
wyświetli tylko linie ze wzorem XXXXXXXX
.
EDYTOWAĆ:
Z twojego komentarza wygląda na to, że chcesz wymienić wszystkie linie bez unwanted_word
. W takim przypadku wszystko czego potrzebujesz to:
grep -v 'unwanted_word' file
-v 'unwanted_word' --after N
nie pomaga, ponieważ OBEJMUJE linię i N linii po.
-v
lub --invert-match
wybierz niepasujące linie. W twoim przypadku grep -v 'unwanted_word' file
lub grep --invert-match 'unwanted_word' file
.
git status -s |grep -v "folder_I_dont_care"
sun
, z wyjątkiem gdy jest to sunrise
, grep sun|grep -v sunrise
pomija linię, która zawiera zarówno sun
i sunrise
od razu, że nie jest to, co chcę. grep -P 'sun(?!rise)'
jest znacznie lepszy.
Zrozumiałem pytanie jako „Jak dopasować słowo, ale wykluczyć inne”, dla którego jednym rozwiązaniem są dwa grep w szeregu: Pierwsze grep znajdowanie poszukiwanego „słowa 1”, drugie grep z wyłączeniem „słowa 2”:
grep "word1" | grep -v "word2"
W moim przypadku: muszę rozróżnić „plot” i „#plot”, którego opcja „word” grepa nie zrobi („#” nie jest alfanumeryczny).
Mam nadzieję że to pomoże.
word1
.
Jeśli grep
wspierasz wyrażenie regularne Perla z -P
opcją, możesz to zrobić (jeśli bash; jeśli tcsh będziesz musiał uciec !
):
grep -P '(?!.*unwanted_word)keyword' file
Próbny:
$ cat file
foo1
foo2
foo3
foo4
bar
baz
Wymieńmy teraz wszystkie foo
opróczfoo3
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
grep -v -P
działa również bez negacji w wyrażeniach regularnych.
!
” . Dziekuję Dziekuję Dziękuję! Właśnie tego chciałem!
Właściwym rozwiązaniem jest użycie grep -v "word" file
, z jego awk
odpowiednikiem:
awk '!/word/' file
Jednakże, jeśli zdarzy ci się mieć bardziej złożoną sytuację, w której chcesz, powiedzmy, XXX
pojawiać się, a YYY
nie pojawiać, wtedy awk
przydaje się zamiast sipowania kilku grep
s:
awk '/XXX/ && !/YYY/' file
# ^^^^^ ^^^^^^
# I want it |
# I don't want it
Możesz nawet powiedzieć coś bardziej złożonego. Na przykład: chcę te linie zawierające albo XXX
albo YYY
, ale nie ZZZ
:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
itp.
grep -P
rozwiązanie dla dużych plików.
grep -P
oznacza użycie wyrażenia regularnego Perla, więc ładowanie tego pakietu będzie znacznie droższe niż normalnie grep
.
grep zapewnia opcję „-v” lub „--invert-match”, aby wybrać niepasujące linie.
na przykład
grep -v 'unwanted_pattern' file_name
Spowoduje to wypisanie wszystkich wierszy z pliku nazwa_pliku, który nie ma „niepożądanego_zakładu”.
Jeśli przeszukujesz wzorzec w wielu plikach w folderze, możesz użyć opcji wyszukiwania rekurencyjnego w następujący sposób
grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'
Tutaj grep spróbuje wyświetlić wszystkie wystąpienia „Want_pattern” we wszystkich plikach z bieżącego katalogu i przekazać go do drugiego grep, aby odfiltrować „niepożądany_pattern”. „|” - pipe powie powłoce, aby połączyła standardowe wyjście lewego programu (grep -r 'Want_pattern' *) ze standardowym wejściem prawego programu (grep -v 'niepożądany_pattern').
Mam katalog z wieloma plikami. Chcę znaleźć wszystkie pliki, które NIE zawierają ciągu „przyspieszenie”, więc z powodzeniem użyłem następującego polecenia:
grep -iL speedup *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"