Bash-Skripting - So finden Sie die Zeilen, die eine bestimmte Zeichenfolge enthalten

Bash-Skripting - So finden Sie die Zeilen, die eine bestimmte Zeichenfolge enthalten

Ich versuche, ein Skript (sagen wir script1.sh) zu schreiben, das die Zeilen findet, die die von mir eingegebenen Wörter enthalten, und zwar in Dateien, die sich in einem bestimmten Verzeichnis und dessen Unterverzeichnissen befinden, und zwar nur in den Dateien mit einer bestimmten Dateierweiterung. Das ./script1.sh python py this.is.what.i.look.forsollte Ergebnisse wie diese liefern:

python/abc/file1.py:11:    this.is.what.i.look.for and the line can contain other things as well
python/file2.py:412: this.is.what.i.look.for this.toggleButton.getElement())

Ich habe versucht, mit grep -r in den Unterverzeichnissen zu suchen und konnte die Zeilen finden.

grep -r -e $3 $1

gibt mir die Zeilen, aber es gelingt mir nicht, andere Dateien mit anderen Dateierweiterungen auszusortieren, und ich konnte keine Möglichkeit finden, $2 in den Code einzufügen. Außerdem habe ich es nicht geschafft, die Zeilennummern in die Mitte zu setzen. Ich habe versucht, die Ausgabe in zwei Teile aufzuteilen, so wie hier: python/abc/file1.py: this.is.what.i.look.for and the line can contain other things as wellmit awk -F " " '{print $1}, aber ich konnte sie nicht wieder zusammensetzen. Ich wollte die Teile der Ausgabe der Grep-Funktion Variablen zuweisen und sie dann wieder zusammensetzen, aber auch das hat nicht funktioniert. t1="grep -r -e $3 $1 | awk -F " " '{print $1}'"Ich habe versucht, " ", ' ' ,$() zu verwenden, um Werte zuzuweisen, da ich nicht wusste, welches ich verwenden sollte, aber nichts davon hat funktioniert.

Antwort1

Zumindest unter GNU können Sie (und ) grepverwenden, um die Übereinstimmungen in einem rekursiven grep einzuschränken, indem Sie einen Glob-Ausdruck im Shell-Stil verwenden:--include--exclude

grep -r --include='*.py' -e pattern dir

Sie können die Nummerierung mit -noder --line-numberergänzen. Denken Sie schließlich daran, die Positionsparameter in Anführungszeichen zu setzen - also

grep -nr --include="*.$2" -e "$3" "$1"

verwandte Informationen