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 ).
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ś.
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.
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="
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 "
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
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.
W grep 2.5.1 musisz dodać tę linię do~/.bashrc lub ~/.profil bash
export GREP_OPTIONS="--exclude=\*.svn\*"
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.
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)
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]}
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.
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
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="
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! XDLook @ this one.
grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags
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}
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:
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.)
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
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
.
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
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:
- Utwórz folder o nazwie "
--F
" Pod currdir ..(lub podlinkuj tam inny folder o nazwie "--F
" iedouble-minus-F
. #> grep -i --exclude-dir="\-\-F" "pattern" *
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