Come posso chiamare awk o sed all'interno di un programma c? So che potrei usare exec(), ma non voglio occuparmi di fork() e di tutta quell'altra cattiveria.Come posso chiamare awk o sed dall'interno di un programma c?
risposta
popen
lavoro? Genera il processo, quindi leggi/scrivi con un handle FILE*
Quindi la vostra scelta è system()
oppure utilizzare una libreria che esegue il wrapping del processo di spawning per voi. Quest'ultimo, o il modo più duro che si voleva evitare, è raccomandato se si desidera un controllo preciso su errori, pipe e così via.
system() è abbastanza facile.
Ma dovresti cercare di non farlo se puoi. Gli script funzionano meglio quando sono in cima alle cose, non al di sotto. Se sei in UNIX, è spesso molto meglio suddividere il lavoro e scrivere uno script di primo livello per chiamare tutti i pezzi.
Ricordo di aver visto un programmatore aggiungere un numero enorme di chiamate di sistema nel suo codice C per evitare di dover imparare la shell Bourne. Ha pensato che fosse un modo intelligente e veloce per farlo funzionare, ma quando ha fallito, ha fallito male. Ha sprecato un sacco di tempo a mettere a punto il caos. Sarebbe stato molto più veloce imparare semplicemente alcuni semplici comandi della shell ...
Paul.
libc
ha funzioni system
e popen
, che funzionano un po 'come questo:
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);
}
(tranne che con maggiore controllo degli errori e cose)
Se si desidera un controllo più preciso sopra la manipolazione (invece di passare attraverso argomento sh
), o se vuoi il controllo su più di uno di {stdin, stdout, stderr}
, dovrai scriverlo da solo o trovare una libreria. Ma la libreria standard copre la maggior parte dei casi d'uso.
È possibile farlo attraverso il sistema() chiamata Questo Threadè un buon esempio
- 1. Chiamare un programma eseguibile usando awk
- 2. elimina una colonna con awk o sed
- 3. Come eseguire tali sostituzioni con AWK o sed o Perl?
- 4. Unione di due linee consecutive utilizzando awk o sed
- 5. Trova e sostituisci per JSON con sed o awk
- 6. sed/awk in maiuscolo stringhe
- 7. Python o awk/sed per la pulizia dei dati
- 8. Utilizzare sed o awk per fissare il formato data
- 9. Come posso ottenere un intervallo di linea ogni ennesimo intervallo usando awk, sed, o un altro comando unix?
- 10. Sed e Awk in uscita e commerciale (&)
- 11. come usare sed, awk o gawk per stampare solo ciò che corrisponde?
- 12. Esiste un programma (o uno script sed) che rimuoverà una funzione da un file C?
- 13. Conversione FASTQ per FASTA con SED/AWK
- 14. differenze tra grep, awk e sed
- 15. Come modificare il separatore decimale con awk/sed?
- 16. Estrazione nome di directory da un percorso assoluto utilizzando sed o awk
- 17. Come passare/ruotare ogni due righe con sed/awk?
- 18. Eliminazione delle prime due righe di un file utilizzando BASH o awk o sed o qualsiasi altra cosa
- 19. Chiamare il metodo C# all'interno di un programma Java
- 20. Come posso chiamare bash da C con un ambiente pulito?
- 21. Stampa di progresso dettagliato da sed e awk
- 22. Come posso uscire dall'uscita di un programma di console C++?
- 23. Cosa può awk fare che sed non può?
- 24. Come invertire l'output di sed?
- 25. Come posso ottenere il codice c di un programma nim?
- 26. Come chiamare il metodo principale di un programma Scala dal metodo principale di un programma java?
- 27. Come posso chiamare il programma python da VBA?
- 28. Estrai usando sed o grep
- 29. Come posso chiamare i metodi di controllo ACPI da C++ o C# su Windows?
- 30. Come posso bloccare l'esecuzione di un programma?