web-dev-qa-db-fra.com

Utilisation de la sortie de awk pour exécuter la commande

Je suis nouveau dans les scripts Shell et je n'arrive pas à comprendre cette tâche apparemment simple. J'ai un fichier texte (ciphers.txt) avec environ 250 lignes, et je voudrais utiliser la première colonne de chaque ligne comme argument dans une commande. Toute aide serait grandement appréciée!

la commande est:

openssl s_client -connect Host:port -cipher argument

Cela fonctionne bien quand je fais un à la fois, mais je ne veux pas vraiment exécuter la même commande 250+ fois. Voici mon script jusqu'à présent:

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

Je reçois toujours une erreur, donc je suis presque sûr d'avoir une erreur de syntaxe quelque part. La sortie de awk est-elle ajoutée après -cipher?

20
nLee

Utilisez system depuis awk:

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

il y a pas mal de problèmes avec votre commande. Pour celui que vous souhaitez utiliser la première colonne. C'est ce qu'on appelle 1 $ en awk et non 0 $ (ce qui serait toute la ligne). Deuxièmement, vous avez oublié un point-virgule à la fin de votre définition de commande.

Pour exécuter réellement la commande, vous pouvez utiliser system () ou un tube (ce dernier n'a de sens que si la commande peut lire à partir de stdin, ce qui, dans votre cas, ne le sera pas avec openssl, je pense). Le plus simple serait quelque chose comme

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

Notez que cela ne renverra que l'état de sortie. Si vous devez capturer stdout, vous devrez diriger la commande via getline.

Andreas

PS: Publier l'erreur réelle que vous avez obtenue aurait aidé.

11
Andreas

La commande xargs est spécifiquement destinée à ce cas d'utilisation.

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

Cette version est un peu plus longue pour le cas d'exemple car awk était déjà utilisé pour analyser $0. Cependant, xargs est utile lorsque vous avez déjà une liste de choses à utiliser et que vous n'exécutez pas quelque chose qui peut exécuter un sous-shell. Par exemple, awk pourrait être utilisé ci-dessous pour exécuter le mv mais xargs est beaucoup plus simple.

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

La commande ci-dessus renomme chaque fichier texte du répertoire actuel en une sauvegarde horodatée. L'équivalent dans awk nécessite de créer une variable à partir des résultats de la commande date, de la transmettre à awk, puis de construire et d'exécuter la commande.

La commande xargs peut également accumuler plusieurs paramètres sur une seule ligne, ce qui est utile si l'entrée a plusieurs colonnes ou lorsqu'un seul enregistrement est divisé en groupes récurrents dans le fichier d'entrée.

Pour en savoir plus sur toutes les façons de l'utiliser, consultez "xargs" All-IN-One Tutorial Guide sur UNIX Mantra.

9
T.Rob