I want to run the system command in an awk script and get its output stored in a variable. I've been trying to do this, but the command's output always goes to the shell and I'm not able to capture it. Any ideas on how this can be done?
Example:
$ date | awk --field-separator=! {$1 = system("strip $1"); /*more processing*/} Should call the strip system command and instead of sending the output to the shell, should assign the output back to $1 for more processing. Rignt now, it's sending output to shell and assigning the command's retcode to $1.
A variable is a character string to which we assign a value. The value assigned could be a number, text, filename, device, or any other type of data. A variable is nothing more than a pointer to the actual data. The shell enables you to create, assign, and delete variables.
Note: Coprocess is GNU awk specific. Anyway another alternative is using getline
cmd = "strip "$1 while ( ( cmd | getline result ) > 0 ) { print result } close(cmd) Calling close(cmd) will prevent awk to throw this error after a number of calls :
fatal: cannot open pipe `…' (Too many open files)
To run a system command in awk you can either use system() or cmd | getline.
I prefer cmd | getline because it allows you to catch the value into a variable:
$ awk 'BEGIN {"date" | getline mydate; close("date"); print "returns", mydate}' returns Thu Jul 28 10:16:55 CEST 2016 More generally, you can set the command into a variable:
awk 'BEGIN { cmd = "date -j -f %s" cmd | getline mydate close(cmd) }' Note it is important to use close() to prevent getting a "makes too many open files" error if you have multiple results (thanks mateuscb for pointing this out in comments).
Using system(), the command output is printed automatically and the value you can catch is its return code:
$ awk 'BEGIN {d=system("date"); print "returns", d}' Thu Jul 28 10:16:12 CEST 2016 returns 0 $ awk 'BEGIN {d=system("ls -l asdfasdfasd"); print "returns", d}' ls: cannot access asdfasdfasd: No such file or directory returns 2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With