co jeśli chcę wykluczyć również N wierszy po wierszu z „niechcianym słowem”? -v 'unwanted_word' --after Nnie pomaga, ponieważ OBEJMUJE linię i N linii po.
Andrey Regentov,
-vlub --invert-matchwybierz niepasujące linie. W twoim przypadku grep -v 'unwanted_word' filelub grep --invert-match 'unwanted_word' file.
adamski.pro
Chcę zignorować jedną linię powyżej i jedną linię poniżej z pasującym wzorcem. Jak mogę to osiągnąć?
Kanji Viroja,
Niesamowite, używam tego w git, aby szybko sprawdzić status mojego repozytorium, działa jak urok:git status -s |grep -v "folder_I_dont_care"
benjaminz
3
Dziwne, to najlepsza odpowiedź, ale w niektórych przypadkach jest błędna! Jeśli chcę, aby znaleźć sun, z wyjątkiem gdy jest to sunrise, grep sun|grep -v sunrisepomija linię, która zawiera zarówno suni sunriseod razu, że nie jest to, co chcę. grep -P 'sun(?!rise)'jest znacznie lepszy.
greene
86
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).
Dzięki za to, bardzo przydatne! Chciałbym wspomnieć, że polecenie grep domyślnie rozróżnia małe
duże litery
2
Zauważ, że grep -v -Pdziała również bez negacji w wyrażeniach regularnych.
cybersoft
„jeśli bash ... musisz uciec !” . Dziekuję Dziekuję Dziękuję! Właśnie tego chciałem!
Gabriel Staples,
36
Właściwym rozwiązaniem jest użycie grep -v "word" file, z jego awkodpowiednikiem:
awk '!/word/' file
Jednakże, jeśli zdarzy ci się mieć bardziej złożoną sytuację, w której chcesz, powiedzmy, XXXpojawiać się, a YYYnie pojawiać, wtedy awkprzydaje się zamiast sipowania kilku greps:
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 XXXalbo YYY, ale nie ZZZ:
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:
Ze strony podręcznika: „-L, --files-without-match Pomiń normalne wyjście; zamiast tego wypisz nazwę każdego pliku wejściowego, z którego normalnie nie wydrukowano by żadnego wyjścia. Skanowanie zatrzyma się przy pierwszym dopasowaniu. ” (Podkreślenie przeze mnie) Więc strzeżcie się tego!
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Odpowiedzi:
Możesz to zrobić za pomocą opcji
-v
(for--invert-match
) grep jako:grep -v "unwanted_word" file
odfiltruje linie, które mająunwanted_word
igrep XXXXXXXX
wyświetli tylko linie ze wzoremXXXXXXXX
.EDYTOWAĆ:
Z twojego komentarza wygląda na to, że chcesz wymienić wszystkie linie bez
unwanted_word
. W takim przypadku wszystko czego potrzebujesz to:źródło
-v 'unwanted_word' --after N
nie pomaga, ponieważ OBEJMUJE linię i N linii po.-v
lub--invert-match
wybierz niepasujące linie. W twoim przypadkugrep -v 'unwanted_word' file
lubgrep --invert-match 'unwanted_word' file
.git status -s |grep -v "folder_I_dont_care"
sun
, z wyjątkiem gdy jest tosunrise
,grep sun|grep -v sunrise
pomija linię, która zawiera zarównosun
isunrise
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”:
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.
źródło
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!
):Próbny:
Wymieńmy teraz wszystkie
foo
opróczfoo3
źródło
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 jegoawk
odpowiednikiem:Jednakże, jeśli zdarzy ci się mieć bardziej złożoną sytuację, w której chcesz, powiedzmy,
XXX
pojawiać się, aYYY
nie pojawiać, wtedyawk
przydaje się zamiast sipowania kilkugrep
s:Możesz nawet powiedzieć coś bardziej złożonego. Na przykład: chcę te linie zawierające albo
XXX
alboYYY
, ale nieZZZ
:itp.
źródło
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ż normalniegrep
.Odwróć dopasowanie za pomocą grep -v:
źródło
grep zapewnia opcję „-v” lub „--invert-match”, aby wybrać niepasujące linie.
na przykład
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
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').
źródło
-v
Opcja pokaże wszystkie linie, które nie pasują do wzorca.źródło
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:
źródło