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"
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}
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 ...
+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.
-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ć:
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ć).
Odpowiedzi:
r
Flaga oznacza szukać rekurencyjnie (wyszukiwanie podkatalogów).i
Flaga oznacza wielkość liter ma znaczenie.Jeśli chcesz tylko nazwy plików, dodaj flagę
l
(małe literyL
):źródło
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
na Ubuntu Desktop 16; jakieś wskazówki?--include=\*.{php,html,js}
Spróbuj czegoś takiego
grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
to
-i
sprawia, ż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-n
drukuje numer wiersza dla meczów.--include
umożliwia dodawanie nazw plików, rozszerzeń. Akceptowane są symbole wieloznaczneWięcej informacji można znaleźć pod adresem : http://www.gnu.org/software/grep/
źródło
-l
opcji (po prostu wypisz nazwy plików, które pasują) zamiast-n
find
je igrep
dla 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 ...źródło
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
na katalogu wagi ~ 500Gb.Brzmi jak idealny do pracy
grep
lub może ackAlbo ta wspaniała konstrukcja:
źródło
-exec grep...
jest lepsze niż mojaxargs
metoda, ponieważ nie dusi się spacjami w nazwach plików.find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Oczywiście można również dodać inne opcje.źródło
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-extended
mówifind
jakiego 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,find
aby uruchomić polecenie (z jego opcjami i argumentami) określone między-exec
opcją a\;
dla każdego znalezionego pliku, gdzie{}
oznacza, gdzie ścieżka pliku przechodzi w tym poleceniu.podczas
E
opcja mówi,grep
aby użyć rozszerzonego wyrażenia regularnego (do obsługi nawiasów) i ...H
Opcja nakazujegrep
wypisać ś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 wynikfind
polecenia do następnego polecenia po tym (czylised
wtedysort
)r
opcja mówi,sed
aby użyć rozszerzonego wyrażenia regularnego.s/HI/BYE/
każesed
zamienić 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.u
mówi sortowi, aby usunął zduplikowane wpisy (wybierzsort -u
jako 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ć).
źródło