it-swarm.com.de

Verwenden der Ausgabe von awk, um den Befehl auszuführen

Ich bin brandneu in der Shell-Skripterstellung und kann diese scheinbar einfache Aufgabe nicht herausfinden. Ich habe eine Textdatei (ciphers.txt) mit etwa 250 Zeilen und möchte die erste Spalte jeder Zeile als Argument in einem Befehl verwenden. Jede Hilfe wäre sehr dankbar!

der Befehl lautet:

openssl s_client -connect Host:port -cipher argument

Es funktioniert gut, wenn ich einen nach dem anderen mache, aber ich möchte nicht wirklich mehr als 250 Mal den gleichen Befehl ausführen. Hier ist mein Drehbuch:

awk '{command = "openssl s_client -connect localhost:4433 -cipher > results.txt"
print $0 | command}' ciphers.txt

Ich erhalte immer wieder eine Fehlermeldung, daher bin ich mir ziemlich sicher, dass ich irgendwo einen Syntaxfehler habe. Wird die Ausgabe von awk nach -cipher angehängt?

20
nLee

Verwenden Sie system in awk:

awk '{ system("openssl s_client -connect Host:port -cipher " $1) }' ciphers.txt
66
David

es gibt einige Dinge, die mit Ihrem Befehl nicht stimmen. Zum einen möchten Sie die erste Spalte verwenden. Dies wird in awk als $ 1 und nicht als $ 0 bezeichnet (das wäre die ganze Zeile). Zweitens haben Sie ein Semikolon am Ende Ihrer Befehlsdefinition vergessen.

Um den Befehl tatsächlich auszuführen, können Sie entweder system () oder eine Pipe verwenden (letzteres ist nur dann sinnvoll, wenn der Befehl von stdin lesen kann, was openssl in Ihrem Fall nicht der Fall ist, denke ich). Am einfachsten wäre sowas

awk '{cmd="openssl s_client -connect Host:port -cipher" $1; system(cmd)}' results.txt

Beachten Sie, dass dies nur den Exit-Status zurückgibt. Wenn Sie stdout erfassen müssen, müssen Sie den Befehl über getline weiterleiten.

Andreas

PS: Das Posten des tatsächlich aufgetretenen Fehlers hätte geholfen.

11
Andreas

Der Befehl xargs ist speziell für diesen Anwendungsfall vorgesehen.

awk '{print $0}' <ciphers.txt | xargs -I{} openssl s_client -connect Host:port -cipher {} >>results.txt

Diese Version ist für den Beispielfall etwas länger, da awk bereits zum Auslesen von $0 Verwendet wurde. xargs ist jedoch nützlich, wenn Sie bereits eine Liste der zu verwendenden Elemente haben und keine Elemente ausführen, die eine Subshell ausführen können. Zum Beispiel könnte awk unten verwendet werden, um mv auszuführen, aber xargs ist viel einfacher.

ls -1 *.txt | xargs -I{} mv "{}" "{}.$(date '+%y%m%d')"

Mit dem obigen Befehl wird jede Textdatei im aktuellen Verzeichnis in eine mit einem Datumsstempel versehene Sicherung umbenannt. Das Äquivalent in awk erfordert, dass aus den Ergebnissen des Befehls date eine Variable erstellt wird, diese an awk übergeben und anschließend der Befehl erstellt und ausgeführt wird.

Der Befehl xargs kann auch mehrere Parameter in einer einzelnen Zeile akkumulieren. Dies ist hilfreich, wenn die Eingabe mehrere Spalten enthält oder wenn ein einzelner Datensatz in der Eingabedatei in wiederkehrende Gruppen aufgeteilt wird.

Weitere Informationen zu allen Verwendungsmöglichkeiten finden Sie unter "xargs" All-IN-One-Lernprogrammhandbuch bei UNIX Mantra.

9
T.Rob