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
Antwort
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")
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
probiere 'logread -f | awk '{if (condition01) {system ("yourCprogram arguments")}}' – nullrevolution
@ 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
Es gibt mehrere Möglichkeiten.
awk hat eine
system()
Funktion, die einen Shell-Befehl ausgeführt wird:system("cmd")
Sie an einem Rohr drucken:
print "blah" | "cmd"
können Sie awk haben Konstruieren Sie Befehle, und leiten Sie alle Ausgaben an die Shell weiter:
awk 'some script' | sh
Etwas so einfach wie dies funktionieren wird
awk 'BEGIN{system("echo hello")}'
und
awk 'BEGIN { system("date"); close("date")}'
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).
Das funktioniert nicht richtig für mich ... – MountainX
@MountainX In welcher Weise funktioniert es (falsch)? Welches Betriebssystem und welche Shell verwenden Sie? – Felix
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
#!/usr/bin/awk -f
BEGIN {
command = "ls -lh"
command |getline
}
Runs "ls -lh" in einem awk-Skript
Sind Sie sicher, dass das funktioniert? das funktioniert nicht. –
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
.
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.
- 1. Die Funktionen eines anderen Programms aufrufen?
- 2. Töten eines Programms mit Multiprocessing
- 3. Push eines ausführbaren Funktionszeigers?
- 4. Halten eines Batch-Programms
- 5. Ausführen eines Clojure-Programms
- 6. Schreiben eines modularen Programms
- 7. Ausgabe eines Multithread-Programms
- 8. Stoppen eines Python-Programms
- 9. Ausgabe eines C-Programms
- 10. Erstellen eines Matlab-Programms mit Octave
- 11. Starten eines Funken-Programms mit Oozie-Workflow
- 12. Ausführen eines externen Programms mit benutzerdefinierten Argumets
- 13. Verknüpfen eines C++ Programms mit SpiderMonkey?
- 14. Starten eines Programms mit einer Datei uri
- 15. Automatisches Neustarten eines Programms mit Stapel
- 16. So rufen Sie die Hauptmethode eines Scala-Programms von der Hauptmethode eines Java-Programms auf?
- 17. Schlechter Look eines gtkmm Programms
- 18. Beenden eines Programms in Python
- 19. Install-PackageProvider wird nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt
- 20. Erstellen eines Programms in R
- 21. Aufruf von ausführbaren Dateien von JSP
- 22. Arbeitsverzeichnis eines anderen Programms ermitteln
- 23. Ergebnis eines kleinen C-Programms
- 24. Kompilieren eines Objective-C-Programms
- 25. Wie die Aufrufe von DeviceIoControl eines Programms unter Windows
- 26. Aufrufen eines anderen Java-GUI-Programms in einer Schleife unter einer bestimmten Bedingung
- 27. Aufrufen eines vorhandenen SAP-Reports in ABAP mit GUI-Unterdrückung
- 28. Erstellen eines selbst-ausführbaren Jar mit Gradle und Kotlin
- 29. Den Pfad des geöffneten Programms aufrufen (Open Office) (Java)
- 30. Aufrufen eines Moduls
Ein kompilierte c-Programm ist nur ein Programm, ... Führen Sie einfach es, wie Sie jede Befehlszeile Betrieb würden ... – PearsonArtPhoto
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
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. –