Wie kann ich awk oder sed in einem c-Programm aufrufen? Ich weiß, dass ich exec() benutzen könnte, aber ich möchte nicht mit fork() und all den anderen Gemeinheiten umgehen.Wie kann ich awk oder sed aus einem c-Programm heraus aufrufen?
Antwort
Würde popen
funktionieren? Es läutet den Prozess, dann lesen/schreiben Sie mit einem FILE*
Griff
Dann ist Ihre Wahl system()
, oder mit einer Bibliothek, die Prozess laichen für Sie umschließt. Letzteres oder die hardcore Methode, die Sie vermeiden wollten, wird empfohlen, wenn Sie eine genaue Kontrolle über Fehler, Pipes und so weiter haben wollen.
System() ist einfach genug.
Aber Sie sollten versuchen, dies nicht zu tun, wenn Sie können. Skripte funktionieren am besten, wenn sie oben liegen, nicht darunter. Wenn Sie mit UNIX arbeiten, ist es oft besser, die Arbeit zu unterbrechen und ein Skript auf oberster Ebene zu schreiben, um alle Teile aufzurufen.
Ich erinnere mich an einen Programmierer beobachten eine große Anzahl von Systemaufrufen in seinem C-Code hinzufügen, um zu vermeiden, die Bourne-Shell zu lernen. Er dachte, es wäre ein kluger und schneller Weg, um es in Gang zu bringen, aber als es scheiterte, scheiterte es sehr. Er hat viel Zeit verschwendet, um das Chaos zu beseitigen. Es wäre viel schneller gewesen, ein paar einfache Shell-Befehle zu lernen ...
Paul.
libc
hat Funktionen system
und popen
, die sich wie ein bisschen arbeiten:
int system(cont char *command) {
const char *argv[4] = {"/bin/sh", "-c", command};
int status;
pid_t child = fork();
if (child == 0) {
execve(argv[0], argv, NULL);
exit(-1);
}
waitpid(child, &status, 0);
return status;
}
FILE *popen(const char *command, const char *type) {
int fds[2];
const char *argv[4] = {"/bin/sh", "-c", command};
pipe(fds);
if (fork() == 0) {
close(fds[0]);
dup2(type[0] == 'r' ? 0 : 1, fds[1]);
close(fds[1]);
execve(argv[0], argv, NULL);
exit(-1);
}
close(fds[1]);
return fdopen(fds[0], type);
}
(außer mit mehr Fehlerprüfung und Sachen)
Wenn Sie durch eine feinere Kontrolle über Argument Handling (statt gehen wollen sh
), oder Sie möchten die Kontrolle über mehr als eines von {stdin, stdout, stderr}
haben, müssen Sie es selbst schreiben oder eine Bibliothek finden. Die Standardbibliothek deckt jedoch die meisten Anwendungsfälle ab.
Sie können es über das System tun() nennen diese Thread ist ein gutes Beispiel
- 1. sed oder awk multiline ersetzen
- 2. Löschen von Zeilennummern in sed oder awk
- 3. bestimmte Spalten aus einem Datensatz mit nur ‚sed‘ ohne ‚awk‘
- 4. Wie caraces wie(), '* [] aus einem Grep-Ergebnis mit grep, awk oder sed entfernen?
- 5. Substitutionen mit sed oder awk Aufzählen
- 6. sed/awk Großschreibung Strings
- 7. Verwendung sed innerhalb awk
- 8. Wie Sed verwenden mit Leerzeichen innerhalb awk
- 9. Sed und Awk Escaping Ampersands (&)
- 10. Wie kann ich das erste Feld einer TSV-Textdatei mit sed (oder awk) bearbeiten?
- 11. Notwendigkeit von sed oder awk-Skript, das einige Hexstring
- 12. add: nach der ersten Spalte mit sed oder awk
- 13. Wie ändere ich das Dezimaltrennzeichen mit awk/sed?
- 14. Merge spezifische Linien - awk/sed
- 15. Aktion für Zeilenbereich in sed/awk ausführen
- 16. So entfernen Sie mehrere Metazeichen mit awk oder sed
- 17. Verwenden sed oder awk Linie nach Spiel zu ersetzen
- 18. Was kann awk tun, dass sed nicht kann?
- 19. Wie mehrere sed und awk Befehle kombinieren?
- 20. füge Zeichen zu spezifischem Feld in sed oder awk hinzu
- 21. Suchen und Ersetzen für JSON mit sed oder awk
- 22. Wie kann ich im n-ten Intervall einen Zeilenbereich mit awk, sed oder einem anderen Unix-Befehl erhalten?
- 23. Kommentieren Sie einen Block eine Datei mit sed oder awk
- 24. Lese Wert aus einer INI-Stil-Datei mit sed/awk
- 25. Verwenden Sie sed oder awk, um das Datumsformat zu beheben
- 26. Verbinden von zwei aufeinanderfolgenden Zeilen mit awk oder sed
- 27. ersetzen ein Attribut in einer anderen mit SED oder awk
- 28. wie sed oder awk verwenden, aus Zeilentrennzeichen in CSV zu ändern
- 29. Sortieren von Strings ohne die Verwendung von awk oder sed
- 30. Kleindateinamen ändern mit awk in Großbuchstaben, sed oder bash