Wie kann ich auf die Ergebnisse des Befehls „Lokalisieren“ reagieren?

Wie kann ich auf die Ergebnisse des Befehls „Lokalisieren“ reagieren?

Ich versuche herauszufinden, wo in der Datei „“ check_dnsdefiniert ist , obwohl es ziemlich viele Dateien gibt.nagioscommands.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, locateda es eine indizierte Kopie ist und viel schneller.

Beim Ausführen locate commands.cfgerhalte 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 xargsoder so weiterzuleiten, sodass ich grepalle 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 xargses hierfür verwenden.

Zum Beispiel ein einfaches:

$ locate commands.cfg | xargs grep check_dns

(Wenn grepmehrere 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 grepnur 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 …)

verwandte Informationen