I found this really cool tool in the FreeBSD ports today that can compile AWK code into an executable binary file.
I haven’t tried anything too complicated, but it managed to compile an AWK program with an internal pipe, but it cannot compile a daisy chain of awk programs piped together in a shell. I think this could be done in stages by producing ‘-c’ function code output for each stage then calling those functions from your own hand made main().
Example AWK Program
This is an awk program to get a list of full names from /etc/passwd
The filename is test.awk
BEGIN {
FS = ":"
}
{
print $5 | "sort -u"
}
AWKA Command
Run awk program: -f test.awk
Output binary: -o test
Data file: -a /etc/passwd
awka -X -f test.awk -o test -a /etc/passwd
The C Code Output
test.c
/* This file generated by AWKA */
#include
#include
int _split_req = 0, _split_max = INT_MAX;
extern int _dol0_used;
extern char _dol0_only;
extern char _env_used;
extern int _max_base_gc, _max_fn_gc;
extern struct awka_fn_struct *_awkafn;
extern int _int_argc;
extern char ** _int_argv;
jmp_buf context;
struct gvar_struct *_gvar;
a_VAR **_lvar;
a_VAR *_lits0_awka=NULL, *_lits1_awka=NULL;
void BEGIN();
void MAIN();
void
BEGIN()
{
awka_strcpy(a_bivar[a_FS], ":");
}
void
MAIN()
{
int i, _curfile;
if (*(awka_gets(a_bivar[a_FILENAME])) == '\0')
awka_strcpy(a_bivar[a_FILENAME], "");
i = setjmp(context);
while (awka_getline(a_TEMP, awka_dol0(0), awka_gets(a_bivar[a_FILENAME]), FALSE, TRUE)->dval > 0 && awka_setNF())
{
awka_print("sort -u", 0, 1, awka_arg1(a_TEMP, awka_doln(5, 0)));
nextrec:;
}
}
int
main(int argc, char *argv[])
{
_max_base_gc = 2;
_max_fn_gc = 2;
awka_varinit(_lits0_awka); awka_strcpy(_lits0_awka, ":");
awka_varinit(_lits1_awka); awka_strcpy(_lits1_awka, "sort -u");
if (!_lvar) {
malloc( &_lvar, 3 * sizeof(a_VAR *) );
_lvar[0] = _lits0_awka;
_lvar[1] = _lits1_awka;
_lvar[2] = NULL;
}
malloc( &_gvar, 1 * sizeof(struct gvar_struct) );
_gvar[0].name = NULL;
_gvar[0].var = NULL;
malloc( &_awkafn, 1 * sizeof(struct awka_fn_struct) );
_awkafn[0].name = NULL;
_awkafn[0].fn = NULL;
_int_argc = 1;
malloc( &_int_argv, 1 * sizeof(char *));
_int_argv[0] = "/etc/passwd";
awka_init(argc, argv, "0.7.5", "12 July 2001");
_split_max = 5;
_split_req = 1;
_dol0_used = 1;
BEGIN();
MAIN();
free(_lits0_awka->ptr); free(_lits0_awka);
free(_lits1_awka->ptr); free(_lits1_awka);
awka_exit(0);
}
Example Output
Auditdistd unprivileged user Avahi Daemon User Binaries Commands and Source Bind Sandbox Bourne-again Superuser Charlie & colord color management daemon Cups Owner D-BUS Daemon User ...