Znajdź pliki zawierające podany tekst

153

W bash chcę zwrócić nazwę pliku (i ścieżkę do pliku) dla każdego typu pliku .php|.html|.jszawierającego ciąg znaków bez rozróżniania wielkości liter"document.cookie" | "setcookie"

Jak bym to zrobił?

piekarnik
źródło
4
Czy rozważałeś użycie grepa? cyberciti.biz/faq/grep-in-bash
Terrance
Ten tytuł jest dość mylący. „znajdź-pliki-zawierające-podany-tekst”
Josh C,

Odpowiedzi:

212
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

rFlaga oznacza szukać rekurencyjnie (wyszukiwanie podkatalogów). iFlaga oznacza wielkość liter ma znaczenie.

Jeśli chcesz tylko nazwy plików, dodaj flagę l(małe litery L):

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
bear24rw
źródło
to wydawało się nie działać dla mnie (przynajmniej nie na Macu) .... po prostu się zawiesza ... egrep -lir --include = * "repo" egrep: ostrzeżenie: rekurencyjne wyszukiwanie stdin
Dean Hiller
13
Zapomniałeś dodać ścieżkę wyszukiwania. Ścieżka to „.” w powyższym przykładzie. W twoim przypadku skrypt czeka na wejście do wyszukiwania na stdin. Spróbuj: egrep -lir --include = * "repo" / (lub dowolna inna ścieżka)
LodeRunner
1
grep -E ... >egrep ...
Aman,
Wystąpił błąd grep: (error|fail): No such file or directoryna Ubuntu Desktop 16; jakieś wskazówki?
Nam G VU
Aby to działało, musiałem pominąć * z \. więc mam--include=\*.{php,html,js}
Mehrad Mahmoudian
53

Spróbuj czegoś takiego grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

to -isprawia, że ​​sprawa jest niewrażliwa

.za pomocą końcowych chcesz zacząć od aktualnego katalogu, to może być podstawiony dowolnym katalogu.

te -rśrodki to zrobić rekurencyjnie, aż drzewie katalogów

-ndrukuje numer wiersza dla meczów.

--includeumożliwia dodawanie nazw plików, rozszerzeń. Akceptowane są symbole wieloznaczne

Więcej informacji można znaleźć pod adresem : http://www.gnu.org/software/grep/

Raoul
źródło
4
A może użyj -lopcji (po prostu wypisz nazwy plików, które pasują) zamiast-n
glenn jackman
15

findje i grepdla ciągu:

Spowoduje to znalezienie wszystkich plików Twojego 3 typów w / start / path i grep dla wyrażenia regularnego '(document\.cookie|setcookie)'. Podziel na 2 wiersze z ukośnikiem odwrotnym tylko dla czytelności ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'
Michaela Berkowskiego
źródło
1
Jak uniwersalne użycie find, ale moim zdaniem lepiej użyć-exec grep -l 'sth' {} \;
NGix
Dzięki @Michael Berkowski W ten sposób najszybszy ponad 5 lub 8 razy # egrep -ir --include=file.foo "(foo|bar)" /dirna katalogu wagi ~ 500Gb.
Qh0stM4N
9

Brzmi jak idealny do pracy greplub może ack

Albo ta wspaniała konstrukcja:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
Fredrik Pihl
źródło
+1 Używanie -exec grep...jest lepsze niż moja xargsmetoda, ponieważ nie dusi się spacjami w nazwach plików.
Michael Berkowski
@MichaelBerkowski: Można go używać tak, aby radzić sobie ze spacjami w nazwach plików: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}. Oczywiście można również dodać inne opcje.
Pascal
4
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'
nr
źródło
3

Aby dołączyć jeszcze jedną alternatywę, możesz również użyć tego:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

Gdzie:

  • -regextype posix-extendedmówi findjakiego rodzaju regex się spodziewać
  • -regex "^.*\.(php|html|js)$"mówi, findże samo wyrażenie regularne nazwy plików muszą być zgodne
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;mówi, findaby uruchomić polecenie (z jego opcjami i argumentami) określone między -execopcją a \;dla każdego znalezionego pliku, gdzie {}oznacza, gdzie ścieżka pliku przechodzi w tym poleceniu.

    podczas

    • Eopcja mówi, grepaby użyć rozszerzonego wyrażenia regularnego (do obsługi nawiasów) i ...
    • HOpcja nakazuje grepwypisać ścieżki plików przed dopasowaniami.

Biorąc to pod uwagę, jeśli chcesz tylko ścieżki do plików, możesz użyć:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

Gdzie

  • |[potok] wyślij wynik findpolecenia do następnego polecenia po tym (czyli sedwtedy sort)
  • ropcja mówi, sedaby użyć rozszerzonego wyrażenia regularnego.
  • s/HI/BYE/każe sedzamienić każde pierwsze wystąpienie (w wierszu) „HI” na „BYE” i ...
  • s/(^.*):.*$/\1/mówi mu, aby zastąpić wyrażenie regularne (^.*):.*$(co oznacza grupę [ element ujęty przez ()] obejmującą wszystko [ .*= jeden lub więcej dowolnego znaku] od początku wiersza [ ^] do „pierwszego”: „po czym następuje cokolwiek do„ końca line [ $]) przez pierwszą grupę [ \1] zastąpionego wyrażenia regularnego.
  • umówi sortowi, aby usunął zduplikowane wpisy (wybierz sort -ujako opcjonalne).

... DUŻO od najbardziej eleganckiego sposobu. Jak powiedziałem, moim zamiarem jest zwiększenie zakresu możliwości (a także przedstawienie pełniejszych wyjaśnień na temat niektórych narzędzi, których możesz użyć).

Pedro Vernetti
źródło