
Ich versuche herauszufinden, wo in der Datei „“ check_dns
definiert ist , obwohl es ziemlich viele Dateien gibt.nagios
commands.cfg
Ich weiß, dass ich zum Suchen nach Übereinstimmungen etwas wie ausführen könnte find / -name "command.cfg" -exec grep check_dns {} \;
, aber wenn möglich würde ich lieber verwenden, locate
da es eine indizierte Kopie ist und viel schneller.
Beim Ausführen locate commands.cfg
erhalte ich die folgenden Ergebnisse:
/etc/nagios3/commands.cfg
/etc/nagiosgrapher/nagios3/commands.cfg
/usr/share/doc/nagios3-common/examples/commands.cfg
/usr/share/doc/nagios3-common/examples/template-object/commands.cfg
/usr/share/nagiosgrapher/debian/cfg/nagios3/commands.cfg
/var/lib/ucf/cache/:etc:nagiosgrapher:nagios3:commands.cfg
Ist es möglich, „locate“ auszuführen und es an einen Inline-Befehl wie xargs
oder so weiterzuleiten, sodass ich grep
alle Ergebnisse sehen kann? Mir ist klar, dass das mit einer For-Schleife möglich ist, aber ich möchte hier mehr Bash-Fu/Shell-Fu lernen als die Vorgehensweise für diesen speziellen Fall.
Antwort1
Ja, Sie können xargs
es hierfür verwenden.
Zum Beispiel ein einfaches:
$ locate commands.cfg | xargs grep check_dns
(Wenn grep
mehrere Dateien angezeigt werden, wird in jeder einzelnen gesucht und das Drucken des Dateinamens bei Übereinstimmungen aktiviert.)
Oder Sie können das Drucken von Dateinamen explizit aktivieren über:
$ locate commands.cfg | xargs grep -H check_dns
(Nur für den Fall, dass einer grep
nur mit 1 Argument aufgerufen wird xargs
)
Für Programme, die nur ein Dateinamenargument akzeptieren (im Gegensatz zu grep
), können Sie die Anzahl der angegebenen Argumente wie folgt beschränken:
$ locate commands.cfg | xargs -n1 grep check_dns
Dadurch werden die Namen der Dateien, aus denen die übereinstimmenden Zeilen stammen, nicht gedruckt.
Das Ergebnis ist äquivalent zu:
$ locate commands.cfg | xargs grep -h check_dns
Mit einem modernen Locate/Xargs können Sie sich auch vor Leerzeichenproblemen schützen:
$ locate -0 commands.cfg | xargs -0 grep -H check_dns
(Standardmäßig wird die Eingabe durch Leerzeichen getrennt xargs
– was natürlich ein Problem darstellt, wenn Ihre Dateinamen Leerzeichen enthalten …)