Rechercher un modèle de texte sous Linux

20

Je suis un débutant Linux. J'ai besoin de rechercher une chaîne "teststring" dans tous les fichiers * .java sous / home / user1 / (y compris les sous-dossiers). Comment puis-je le faire sous linux via la commande shell.

Dark Vador
la source
Il y a eu plusieurs questions concernant la recherche d'expressions régulières dans les sous-répertoires de la ligne de commande
RobotHumans
une recherche rapide a révélé cette question: superuser.com/questions/208271/… pas exactement ce que vous cherchez, mais au lieu d'exécuter cp, vous pouvez cat / grep que ce soit
RobotHumans
Je peux lister le fichier ayant l'extension avec find / home / user1 -name * .java Comment utiliser grep là-dessus?
Darthvader

Réponses:

23

La façon la plus simple est d'utiliser les fonctionnalités de GNU grep:

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

Si vous êtes déjà sur une autre variante Unix qui n'a pas grep GNU, voici une méthode portable:

find /home/user1 -name '*.java' -exec grep teststring {} +
Gilles 'SO- arrête d'être méchant'
la source
nice ne connaissait pas cette fonctionnalité grep
RobotHumans
1
Si vous recherchez le répertoire actuel et tous les fichiers, c'estgrep -r teststring .
Chris Moschini
4

en utilisant ack vous tapez simplement:cd /home/user01 && ack --java teststring

Benoit
la source
1
ouack --java teststring /home/user01
Andy Lester du
4

Pour cet ack aka ack-grep, c'est l'application la plus meurtrière dans mon esprit;)

Vous pouvez ack some_string /in/path_ytrouver some_string dans path_y Ou plus simple ack some_other_stringde trouver some_other_sting dans le répertoire actuel.

zzeroo
la source
2

Je l'ai trouvé. L'afficher car cela pourrait aider quelqu'un.

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

Veuillez corriger s'il existe un meilleur moyen.

Dark Vador
la source
3
En règle générale, vous devez utiliser -print0et -0lorsque la tuyauterie finddans xargsle travail correctement avec les fichiers qui peuvent avoir des espaces ou des sauts de ligne dans leur nom:find /home/user01 -name *.java -print0 | xargs -0 grep "teststring"
Suspendu jusqu'à nouvel ordre.
0
grep -irl teststring *java
Unni
la source