2017-03-10 9 views
0

In Cygwin, schrieb ich eine bashrc Funktion rg, die im Grunde eine rekursive grep-Anweisung lautet:Mit -exec auf Ausgabe von bashrc Funktion

rg() { 
    find . -type f -exec grep -il $1 {} \; 
} 

Das funktioniert gut, aber jetzt muss ich auf einen zusätzlichen grep laufen jede Ausgangsleitung, um nach einem anderen Wort zu suchen. Ich möchte im Grunde, dass es jede Datei auflistet, die beide Wörter enthält (nicht unbedingt in derselben Zeile). Ich habe diesen Befehl versucht:

rg Word1 -exec grep -il Word2 {} \; 

Dies scheint nur die gleichen Dateien ausgeben, die "Word1" enthalten.

Ich versuchte diesen nächsten Befehl, und ich dachte, es würde nur "Ha" auf jeder Zeile ausgeben, aber es führt immer noch die Dateien aus der "rg Word1" -Anweisung auf.

rg Word1 -exec echo "Ha" \; 

Also mache ich hier offensichtlich etwas falsch. Kann jemand meine Verwirrung klären? Ich bin mir bewusst, dass es einen Weg gibt, dies in Grep selbst zu tun, aber das scheint pro Zeile zu funktionieren. Ich vermute, was ich versuche zu tun ist ziemlich üblich. Auch wenn ich das funktioniere, würde ich es gerne in eine andere Bashrc-Funktion einfügen. Nicht sicher, ob das komplizierter ist oder nicht.

+1

Sie übergeben die '-exec grep -il Word2 {} \; 'als Argumente zu' rg', aber Sie verwenden sie nirgendwo in der Funktion, so dass sie keine Wirkung haben –

+0

Also im Grunde bist du einfach Ausführen des Befehls 'finden. -type f -exec grep -il Word1 {} 'wie' $ 1' ist 'Word1' in beiden Beispielen. – 123

+0

Also gibt es eine Möglichkeit, die "-exec Grep" kein Argument von rg? Ist es möglich, exec für eine Funktion wie diese zu verwenden? – Zip184

Antwort

1

Wenn Sie es haben oder erhalten können, sammelt der xargs Befehl Argumente für einen Befehl von seiner Standardeingabe und führt dann den angegebenen Befehl aus. Sie können dies mit Ihrer rg Funktion kombinieren, um den Ausgang der Funktion zu filtern. Zum Beispiel

rg Word1 | xargs grep -il Word2 

Die Argumente xargs von seinem Standardeingabe liest - die Dateinamen durch die Funktion emittiertes rg - wird auf den gegebenen Befehl (grep -il Word2) angehängt werden, und die sich ergebende Befehl ausgeführt. Wenn die Eingabe von xargs lang genug ist, werden die Argumente auf mehrere Aufrufe des Befehls grep verteilt, was für die Ausgabe keinen Unterschied macht (in diesem Fall), aber verhindert, dass die Befehlsausführung aufgrund zu vieler Argumente fehlschlägt.


Betrachten auch Funktion rg in der gleichen Weise strukturiert (d.h. unter Verwendung von xargs), um die Anzahl von separaten grep Prozesse zu minimieren, die ausgeführt werden. Starten eines neuen Prozesses ist eine der teureren Dinge, die Sie tun können.