2013-01-31 12 views
22

Ich habe ein Programm in C, die ich mit Hilfe von awk in Shell-Skripts aufrufen möchte. Wie kann ich so etwas tun?Aufrufen eines ausführbaren Programms mit awk

+1

Ein kompilierte c-Programm ist nur ein Programm, ... Führen Sie einfach es, wie Sie jede Befehlszeile Betrieb würden ... – PearsonArtPhoto

+1

Sie können auch anrufen 'System()' mit awk, um Befehle auszuführen. Vielleicht könntest du deine Bedürfnisse weiter erklären, da es eine bessere Methode gibt,> 90% der Zeit zu gehen. – Grambot

+2

Dies ist in der Regel der falsche Ansatz. Wenn Sie ein kleines awk-Skript posten und erklären, wann Sie Ihr C-Programm aufrufen wollen, können wir Ihnen sagen, wie Sie das machen sollen oder was ein besserer Ansatz wäre. –

Antwort

29

Von der AWK-man-Seite:

 
system(cmd) 
       executes cmd and returns its exit status 

Die GNU AWK manual hat auch a section, die zum Teil die system Funktion beschreibt und zeigt ein Beispiel:

system("date | mail -s 'awk run done' root") 
+0

danke für Ihre Hilfe! Ich habe einen Shell-Befehl in busybox: logread -f | awk {if .....} und in der awk möchte ich mein Programm in c aufrufen, wenn eine if-Anweisung mit Argumenten wahr ist. Kannst du mir einen Hinweis geben? – user2030431

+1

probiere 'logread -f | awk '{if (condition01) {system ("yourCprogram arguments")}}' – nullrevolution

+0

@ user2030431 Sie wären nett zu Lesern, wenn Sie Ihre Frage mit diesen/weiteren Details aktualisieren würden. Und ja, ich weiß es ein bisschen spät dafür :) – Felix

19

Es gibt mehrere Möglichkeiten.

  1. awk hat eine system() Funktion, die einen Shell-Befehl ausgeführt wird:

    system("cmd")

  2. Sie an einem Rohr drucken:

    print "blah" | "cmd"

  3. können Sie awk haben Konstruieren Sie Befehle, und leiten Sie alle Ausgaben an die Shell weiter:

    awk 'some script' | sh

4

Etwas so einfach wie dies funktionieren wird

awk 'BEGIN{system("echo hello")}' 

und

awk 'BEGIN { system("date"); close("date")}'

1

Es hängt wirklich :) Auf dem handlichen Linux Kern utils (info coreutils) ist xargs. Wenn Sie awk verwenden, haben Sie wahrscheinlich einen komplizierteren Anwendungsfall im Kopf - Ihre Frage ist nicht sehr detailliert.

printf "1 2\n3 4" | awk '{ print $2 }' | xargs touch 

Führt touch 2 4 aus. Hier könnte touch durch Ihr Programm ersetzt werden. Mehr Infos unter info xargs und man xargs (wirklich, lesen Sie diese). Ich glaube, Sie möchten touch mit Ihrem Programm ersetzen.

Aufteilung von zuvor erwähnten Skript:

printf "1 2\n3 4" 
# Output: 
1 2 
3 4 

# The pipe (|) makes the output of the left command the input of 
# the right command (simplified) 
printf "1 2\n3 4" | awk '{ print $2 }' 
# Output (of the awk command): 
2 
4 

# xargs will execute a command with arguments. The arguments 
# are made up taking the input to xargs (in this case the output 
# of the awk command, which is "2 4". 
printf "1 2\n3 4" | awk '{ print $2 }' | xargs touch 
# No output, but executes: `touch 2 4` which will create (or update 
# timestamp if the files already exist) files with the name "2" and "4" 

aktualisieren In der ursprünglichen Antwort, habe ich echo statt printf. Jedoch ist printf die bessere und portablere Alternative, wie durch einen Kommentar hervorgehoben wurde (wo große Links zu Diskussionen gefunden werden können).

+0

Das funktioniert nicht richtig für mich ... – MountainX

+0

@MountainX In welcher Weise funktioniert es (falsch)? Welches Betriebssystem und welche Shell verwenden Sie? – Felix

+0

In Arch Linux und bash, hier sind meine Ergebnisse: [Benutzer @ comp1 ~] $ echo "1 2 \ n3 4" | awk '{print $ 2}' | xargs berühren [user @ comp1 ~] $ ls -rw-rw ---- 1 User 0 7. März 13.34 2n3 – MountainX

2
#!/usr/bin/awk -f 

BEGIN { 
    command = "ls -lh" 

    command |getline 
} 

Runs "ls -lh" in einem awk-Skript

+1

Sind Sie sicher, dass das funktioniert? das funktioniert nicht. –

0

Ich benutze die Macht der awk einige meiner gestoppt Docker-Container zu löschen.Beobachten Sie sorgfältig, wie ich die cmd Schnur zuerst konstruiere, bevor Sie sie an system übergibt.

docker ps -a | awk '$3 ~ "/bin/clish" { cmd="docker rm "$1;system(cmd)}'

Hier verwende ich die dritte Spalte das Muster „/ bin/Clish“ aufweist, und dann extrahieren ich die Container-ID in der ersten Spalte meine cmd String erstellen und übergeben das zu system.

0

Ich konnte dies über folgende Verfahren durchführen lassen

cat ../logs/em2.log.1 |grep -i 192.168.21.15 |awk '{system(`date`); print $1}' 

awk hat eine Funktion namens System es Sie jeden Linux-Bash-Befehl in der Ausgabe von awk auszuführen ermöglicht.

Verwandte Themen