Wyszukaj wzór tekstu w systemie Linux

20

Jestem początkującym Linuksem. Muszę wyszukać ciąg „teststring” we wszystkich plikach * .java znajdujących się w katalogu / home / user1 / (łącznie z podfolderami). Jak mogę to zrobić w systemie Linux za pomocą polecenia powłoki.

darthvader
źródło
Pojawiło się kilka pytań dotyczących wyszukiwania
wyrażeń
szybkie wyszukiwanie pokazało to pytanie: superuser.com/questions/208271/... nie do końca to, czego szukasz, ale zamiast exec cp możesz cat / grep cokolwiek
RobotHumans
Mogę wymienić plik o rozszerzeniu z find / home / user1 -name * .java Jak na tym używać grep?
darthvader

Odpowiedzi:

23

Najprostszym sposobem jest użycie funkcji GNU grep:

grep -r --include '*.java' teststring /home/user1

Jeśli kiedykolwiek korzystasz z innego wariantu unixa, który nie ma GNU grep, oto przenośny sposób:

find /home/user1 -name '*.java' -exec grep teststring {} +
Gilles „SO- przestań być zły”
źródło
nice nie wiedział o tej funkcji grep
RobotHumans
1
Jeśli szukasz aktualnego katalogu i wszystkich plikówgrep -r teststring .
Chris Moschini,
4

używając ack wystarczy wpisać:cd /home/user01 && ack --java teststring

Benoit
źródło
1
luback --java teststring /home/user01
Andy Lester,
4

Dla tego ack aka ack-grep to moja aplikacja zabójcy;)

Możesz ack some_string /in/path_yznaleźć some_string w path_y Lub prościej ack some_other_stringjest znaleźć some_other_sting w bieżącym katalogu.

zzeroo
źródło
2

Znaleziono to. Publikowanie, ponieważ może komuś pomóc.

find /home/user01 -name *.java | xargs grep "teststring"

Popraw, jeśli istnieje lepszy sposób.

darthvader
źródło
3
Ogólnie rzecz biorąc, powinieneś używać -print0i -0podczas przesyłania finddo, xargsaby poprawnie pracować z plikami, które mogą mieć spacje lub znaki nowej linii w nazwach:find /home/user01 -name *.java -print0 | xargs -0 grep "teststring"
Wstrzymane do odwołania.
0
grep -irl teststring *java
Unni
źródło