How can I pass variables from awk to a shell command?

你。 提交于 2019-12-17 09:10:03

问题


I am trying to run a shell command from within awk for each line of a file, and the shell command needs one input argument. I tried to use system(), but it didn't recognize the input argument.

Each line of this file is an address of a file, and I want to run a command to process that file. So, for a simple example I want to use 'wc' command for each line and pass $1to wc.

awk '{system("wc $1")}' myfile

回答1:


you are close. you have to concatenate the command line with awk variables:

awk '{system("wc "$1)}' myfile



回答2:


You cannot grab the output of an awk system() call, you can only get the exit status. Use the getline/pipe or getline/variable/pipe constructs

awk '{
    cmd = "your_command " $1
    while (cmd | getline line) {
        do_something_with(line) 
    }
    close(cmd)
}' file



回答3:


FYI here's how to use awk to process files whose names are stored in a file (providing wc-like functionality in this example):

gawk '
NR==FNR { ARGV[ARGC++]=$0; next }
{ nW+=NF; nC+=(length($0) + 1) }
ENDFILE { print FILENAME, FNR, nW, nC; nW=nC=0 }
' file

The above uses GNU awk for ENDFILE. With other awks just store the values in an array and print in a loop in the END section.




回答4:


Or use the pipe | as in bash then retrive the output in a variable with awk's getline, like this

 zcat /var/log/fail2ban.log* | gawk  '/.*Ban.*/  {print $7};' | sort | uniq -c | sort | gawk '{ "geoiplookup " $2 "| cut -f2 -d: " | getline geoip; print $2 "\t\t" $1 " " geoip}'

That line will print all the banned IPs from your server along with their origin (country) using the geoip-bin package.

The last part of that one-liner is the one that affects us :

gawk '{ "geoiplookup " $2 "| cut -f2 -d: " | getline geoip; print $2 "\t\t" $1 " " geoip}'

It simply says : run the command "geoiplookup 182.193.192.4 | -f2 -d:" ($2 gets substituted as you may guess) and put the result of that command in geoip (the | getline geoip bit). Next, print something something and anything inside the geoip variable.

The complete example and the results can be found here, an article I wrote.



来源:https://stackoverflow.com/questions/20646819/how-can-i-pass-variables-from-awk-to-a-shell-command

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!