Użyj składni grep --exclude/--include, aby nie używać grep przez niektóre pliki

Szukam ciągu foo= w plikach tekstowych w drzewie katalogów. Jest na zwykłej maszynie Linuksowej, mam powłokę bash:

grep -ircl "foo=" *

W katalogach jest również wiele plików binarnych, które pasują do " foo=". Ponieważ te wyniki nie są istotne i spowalniają wyszukiwanie, chcę, aby grep pominął przeszukiwanie tych plików (głównie obrazów JPEG i PNG). Jak miałbym to zrobić?

Wiem, że są opcje --exclude=PATTERN i --include=PATTERN, ale jaki jest format wzorca? Strona podręcznika grep says:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

Wyszukiwanie na grep include, grep include exclude, grep exclude and variants didn ' t find anything relevant

Jeśli jest lepszy sposób grepowania tylko w niektórych plikach, jestem za; przenoszenie plików nie wchodzi w grę. Nie mogę przeszukiwać tylko niektórych katalogów(struktura katalogów to wielki bałagan, wszystko jest wszędzie). Poza tym nie mogę nic zainstalować, więc mam do czynienia ze zwykłymi narzędziami (takimi jak grep lub sugerowany find ).

Author: random, 2008-10-21

22 answers

Użyj składni Shell globbing:

grep pattern -r --include=\*.{cpp,h} rootdir

Składnia --exclude jest identyczna.

Zauważ, że gwiazda jest unikana z odwrotnym ukośnikiem, aby zapobiec jej rozszerzeniu przez powłokę (cytowanie jej, takie jak --include="*.{cpp,h}", byłoby równie dobre). W przeciwnym razie, jeśli w bieżącym katalogu roboczym znajdują się pliki pasujące do wzorca, linia poleceń rozszerzy się do czegoś w rodzaju grep pattern -r --include=foo.cpp --include=bar.h rootdir, który przeszukuje tylko pliki o nazwach foo.cpp i bar.h, co prawdopodobnie nie jest tym, czego chciałeś.

 635
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 22:53:57

Jeśli chcesz po prostu pominąć pliki binarne, proponuję spojrzeć na opcję -I (wielkie litery i). Ignoruje pliki binarne. Regularnie używam następującego polecenia:

grep -rI --exclude-dir="\.svn" "pattern" *

Przeszukuje rekurencyjnie, ignoruje pliki binarne i nie zagląda do ukrytych folderów Subversion w poszukiwaniu pożądanego wzorca. Mam to aliased jako "grepsvn" na moim polu w pracy.

 199
Author: rmeador,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 12:58:53

Proszę spojrzeć na ack , który jest przeznaczony do właśnie takich sytuacji. Twój przykład

grep -ircl --exclude=*.{png,jpg} "foo=" *

Robi się z ack jako

ack -icl "foo="

Ponieważ ack domyślnie nigdy nie szuka w plikach binarnych, a-r jest domyślnie włączone. A jeśli chcesz tylko pliki CPP i H, to po prostu zrób

ack -icl --cpp "foo="
 54
Author: Andy Lester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 14:18:19

Grep 2.5.3 wprowadził parametr --exclude - dir, który będzie działał tak, jak chcesz.

grep -rI --exclude-dir=\.svn PATTERN .

Można również ustawić zmienną środowiskową: GREP_OPTIONS= " --exclude-dir=.svn "

Będę drugi Andy ' S głosuj na ack chociaż jest najlepszy.

 32
Author: Corey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:25

Znalazłem to po długim czasie, można dodać wiele includes i excludes jak:

grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js
 22
Author: Rushabh Mehta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-20 04:54:44

Sugerowane polecenie:

grep -Ir --exclude="*\.svn*" "pattern" *

Jest błędem koncepcyjnym, ponieważ --exclude działa na nazwie bazowej. Innymi słowy, to pominie tylko .svn w bieżącym katalogu.

 11
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-17 18:56:38

W grep 2.5.1 musisz dodać tę linię do~/.bashrc lub ~/.profil bash

export GREP_OPTIONS="--exclude=\*.svn\*"
 11
Author: deric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-01 10:13:14

Uważam, że wyjście grepa jest czasami bardzo pomocne:

grep -rn "foo=" . | grep -v "Binary file"

To jednak nie powstrzymuje go przed przeszukiwaniem plików binarnych.

 9
Author: Aaron Maenpaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 13:44:45

Na CentOS 6.6 / Grep 2.6.3 muszę go używać tak:

grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"

Zauważ Brak znaków równości " = " (inaczej --include, --exclude, include-dir i --exclude-dir są ignorowane)

 7
Author: aesede,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-07 18:43:19

Jeśli nie jesteś przeciwny używaniu find, podoba mi się jego -prune funkcja: {[0]}

W pierwszej linii podajesz katalog, który chcesz przeszukać. . (bieżący katalog) jest poprawną ścieżką, na przykład.

Na 2. i 3. linii, użyj "*.png", "*.gif", "*.jpg", i tak dalej. Używaj tylu -o -name "..." -prune konstruktów ile masz wzorców.

W czwartej linii potrzebujesz innego -o (określa "lub" do find), pożądanych wzorców i potrzebujesz -print lub -print0 na końcu. Jeśli po prostu chcesz "Wszystko inne", które pozostaje po przycinaniu *.gif, *.png, itd. obrazów, następnie użyj -o -print0 i skończyłeś z 4. linijką.

Wreszcie, na piątej linii znajduje się rura do xargs, która pobiera każdy z tych plików wynikowych i przechowuje je w zmiennej FILENAME. Następnie przekazuje grep znaczniki -IR, "pattern", a następnie {[18] } jest rozszerzana o xargs, aby stać się listą nazw plików znalezionych przez find.

Na twoje szczególne pytanie, stwierdzenie może wyglądać jak: {[1]}

 6
Author: OnlineCop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-15 18:28:16

Jestem dyletantem, przyznaję, ale oto jak mój ~/.bash_profile wygląda:

export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'

Zauważ, że aby wykluczyć dwa katalogi, musiałem użyć --exclude-dir dwa razy.

 5
Author: 4D4M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-27 06:02:29

Spróbuj tego:

 $ find . -name "*.txt" -type f -print | xargs file | grep "foo=" | cut -d: -f1

Założony tutaj: http://www.unix.com/shell-programming-scripting/42573-search-files-excluding-binary-files.html

 3
Author: Gravstar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 13:54:13

Find i xargs są twoimi przyjaciółmi. Używaj ich do filtrowania listy plików zamiast --exclude

Spróbuj czegoś takiego

find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="
 2
Author: Andrew Stein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 13:45:26

Te skrypty nie rozwiązują całego problemu...Spróbuj lepiej:

du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"

Ten skrypt jest o wiele lepszy, ponieważ używa "prawdziwych" wyrażeń regularnych, aby uniknąć wyszukiwania katalogów. po prostu oddziel nazwy folderów lub plików z "\ / " na grep-v

Smacznego! znaleziony na mojej powłoce Linuksa! XD
 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-05 08:30:45

Look @ this one.

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags
 2
Author: suhas tawade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-20 00:57:46

Jeśli wyszukujesz non-rekurencyjnie, możesz użyć wzorców glop, aby dopasować nazwy plików.

grep "foo" *.{html,txt}

Zawiera html i txt. Wyszukuje tylko w bieżącym katalogu.

Aby wyszukać w podkatalogach:

   grep "foo" */*.{html,txt}

W podkatalogach:

   grep "foo" */*/*.{html,txt}
 2
Author: Stéphane Laurent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-22 03:15:30

git grep

Użyj git grep, który jest zoptymalizowany pod kątem wydajności i ma na celu przeszukiwanie określonych plików.

Domyślnie ignoruje pliki binarne i honoruje twoje .gitignore. Jeśli nie pracujesz z Git structure, nadal możesz go użyć przekazując --no-index.

Przykładowa składnia:

git grep --no-index "some_pattern"

Aby uzyskać więcej przykładów, zobacz:

 2
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-14 23:01:51

--binary-files=without-match opcja GNU grep pozwala na pominięcie plików binarnych. (Odpowiednik -I przełącznika wymienionego w innym miejscu.)

(może to wymagać najnowszej wersji grep; ma ją przynajmniej 2.5.3.)

 1
Author: mjs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 11:04:44

Nadaje się do tcsh .plik aliasu:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

Zajęło mi trochę czasu, aby dowiedzieć się, że {mm,m,h,cc,c} część nie powinna być wewnątrz cudzysłowów. ~ Keith

 1
Author: Keith Knauber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 17:52:48

W katalogach jest również wiele plików binarnych. Nie mogę przeszukiwać tylko niektórych katalogów (struktura katalogów to wielki bałagan). Czy jest lepszy sposób na grepowanie tylko w niektórych plikach?

ripgrep

Jest to jedno z najszybszych narzędzi przeznaczonych do rekurencyjnego przeszukiwania bieżącego katalogu. Jest napisany w Rust, zbudowany na bazie silnika regex Rusta dla maksymalnej wydajności. Sprawdź szczegółową analizę tutaj .

Więc możesz po prostu uruchomić:

rg "some_pattern"

Respektuje Twoje .gitignore i automatycznie pomija ukryte pliki / katalogi i pliki binarne.

Nadal można dostosować dołączanie lub wykluczanie plików i katalogów za pomocą -g/--glob. Globbing rules match .gitignore globs. Sprawdź man rg, aby uzyskać pomoc.

Aby uzyskać więcej przykładów, zobacz: jak wykluczyć niektóre pliki, które nie pasują do niektórych rozszerzeń grepa?

Na macOS, można zainstalować przez brew install ripgrep.

 1
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-14 23:02:37

Aby zignorować wszystkie binarne wyniki z grep

grep -Ri "pattern" * | awk '{if($1 != "Binary") print $0}'

Część awk odfiltruje wszystkie linie pliku binarnego Foo dopasowane

 0
Author: lathomas64,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-24 06:39:23

Spróbuj tego:

  1. Utwórz folder o nazwie "--F " Pod currdir ..(lub podlinkuj tam inny folder o nazwie "--F " ie double-minus-F.
  2. #> grep -i --exclude-dir="\-\-F" "pattern" *
 -2
Author: P Stack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-07 16:11:32