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?
Utilisez system
depuis awk:
awk '{ system("openssl s_client -connect Host:port -cipher " $1) }' ciphers.txt
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é.
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.