L'appel d'un programme exécutable à l'aide de awk
J'ai un programme en C que je veux l'appeler par l'utilisation de awk dans les scripts shell. Comment puis-je faire quelque chose comme cela?
- La compilation d'un programme c est juste un programme... Juste l'exécuter comme vous le feriez pour toute opération de ligne de commande...
- Vous pouvez appeler
system()
avec awk pour exécuter des commandes. Pouvez-vous nous expliquer vos besoins, puisqu'il y a une meilleure méthode de choses à ce sujet >90% du temps. - ce n'est généralement pas la bonne approche. Si vous postez un petit script awk et expliquer quand vous voulez appeler votre programme C, nous pouvons dire soit la façon de le faire ou de ce qu'est une meilleure approche serait.
Vous devez vous connecter pour publier un commentaire.
À partir de la page de man AWK:
GNU AWK manuel a également une section qui, en partie, décrit les
system
fonction et fournit un exemple:logread -f | awk '{ if(condition01){system("yourCprogram arguments")} }'
Il existe plusieurs manières.
awk est un
system()
fonction qui va exécuter une commande shell:system("cmd")
Vous pouvez imprimer à un tuyau:
print "blah" | "cmd"
Vous awk peut construire des commandes, et le tuyau de la sortie de la coque:
awk 'some script' | sh
Quelque chose d'aussi simple que cela fonctionne
et
awk 'BEGIN { system("date"); close("date")}'
Pistes "ls -lh" dans un script awk
Cela dépend vraiment 🙂 l'Un des handy linux de base utils (
info coreutils
) estxargs
. Si vous utilisezawk
vous avez probablement plus d'implication de cas d'utilisation à l'esprit que votre question n'est pas très détaillé.Exécutera
touch 2 4
. Icitouch
pourrait être remplacé par votre programme. Plus d'info àinfo xargs
etman xargs
(vraiment, lire ces).Je crois que vous voulez remplacer
touch
avec votre programme.Répartition de cités script:
Mise à jour Dans la réponse originale à cette question, j'ai utilisé
echo
au lieu deprintf
. Cependant,printf
est le meilleur et le plus portable de remplacement comme l'a souligné un commentaire (où de grands liens avec les discussions peuvent être trouvés).Un beaucoup plus robuste serait d'utiliser la
getline()
fonction de GNUawk
d'utiliser une variable à partir d'un tuyau. Dans la formecmd | getline
résultat,cmd
est exécuté, puis sa sortie est redirigée versgetline
. Il retourne1
si suis sortie,0
si EOF,-1
en cas d'échec.D'abord construire l'exécution de la commande dans une variable dans le
BEGIN
clause si la commande est pas dépend du contenu du fichier, par exemple un simpledate
ou unls
.Un exemple simple de ce qui précède serait
Lors de l'exécution de la commande est partie de la colonnade du contenu d'un fichier, vous générez le
cmd
chaîne dans le principal{..}
comme ci-dessous. E. g. considérons un fichier dont le$2
contient le nom du fichier et vous voulez qu'il soit remplacé par lemd5sum
de hachage du contenu du fichier. Vous pouvez faireJe utiliser la puissance de awk pour supprimer certains de mes cessé de conteneurs docker. Observer attentivement la façon dont je construis le
cmd
la chaîne avant de passer àsystem
.docker ps -a | awk '$3 ~ "/bin/clish" { cmd="docker rm "$1;system(cmd)}'
Ici, j'utilise la 3ème colonne ayant le modèle de "/bin/clish" puis-je extraire le numéro du conteneur dans la première colonne de construire mon
cmd
chaîne et votée àsystem
.J'ai été en mesure d'avoir ce fait via la méthode ci-dessous
awk dispose d'une fonction appelée système, il vous permet d'exécuter toutes les versions de linux bash de commande à l'intérieur de la sortie de awk.