Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux awk-将总和发送到全局变量_Linux_Bash_Awk_Scope - Fatal编程技术网

Linux awk-将总和发送到全局变量

Linux awk-将总和发送到全局变量,linux,bash,awk,scope,Linux,Bash,Awk,Scope,我在bash脚本中有一行代码,它计算到某个页面的唯一IP请求的总和 grep$forday$ACCESSLOG | grep“$1”| awk-F”-“{print$1}”排序| uniq-c | awk'{sum+=1;print}END{print',sum,“total”} 我试图将sum的值获取到awk语句之外的一个变量,以便可以相互比较页面。到目前为止,我已经尝试了以下各种组合: unique\u sum=0 grep$forday$ACCESSLOG | grep“$1”| awk-

我在bash脚本中有一行代码,它计算到某个页面的唯一IP请求的总和

grep$forday$ACCESSLOG | grep“$1”| awk-F”-“{print$1}”排序| uniq-c | awk'{sum+=1;print}END{print',sum,“total”}

我试图将sum的值获取到awk语句之外的一个变量,以便可以相互比较页面。到目前为止,我已经尝试了以下各种组合:

unique\u sum=0
grep$forday$ACCESSLOG | grep“$1”| awk-F”-“{print$1}”| sort | uniq-c | awk'{sum+=1;print;$unique|sum=sum}END{print',sum,“total”}
回显“${unique\u sum}”

这将导致“0”的回声。我尝试将
\uuu$unique\u sum=sum\uuu
放在
末尾,初始化变量(
awk-v unique\u sum=0…
)和将变量赋值放在引用部分之外的各种组合

到目前为止,我的GoogleFu失败得很惨,因为大多数人只是将整个输出发送到一个变量。在本例中,除了打印总数之外,还打印了许多行(每个IP一行)。如果无法捕获“sum”变量,是否有方法捕获最后一行输出


这可能是我在awk中尝试过的最复杂的事情之一,所以我对自己做过任何有用的事情的信心都很低。任何帮助都将不胜感激

不能在awk程序中分配shell变量。通常,没有子进程可以改变其父进程的环境。您必须让awk程序打印出计算值,然后shell可以获取该值并将其分配给变量:

output=$( grep $YESTERDAY $ACCESSLOG | grep "$1" | awk -F" - " '{print $1}' | sort | uniq -c | awk '{sum += 1; print } END {print sum}' )
unique_sum=$( sed -n '$p' <<< "$output" )  # grab the last line of the output
sed '$d' <<< "$output"          # print the output except for the last line
echo "     $unique_sum total"
is(更长,但只有一个进程)

最后一个awk程序只计算有多少行可以替换为
wc-l

总而言之:

unique_output=$(
    awk -F" - " -v date="$YESTERDAY" -v patt="$1" '
        $0 ~ date && $0 ~ patt {print $1}
    ' "$ACCESSLOG" | sort | uniq -c
)
echo "$unique_output"
unique_sum=$( wc -l <<< "$unique_output" )
echo "     $unique_sum total"
unique\u输出=$(
awk-F“--v date=“$dayed”-v patt=“$1”
$0~日期和$0~打印$1}
“$ACCESSLOG”| sort | uniq-c
)
echo“$unique_输出”

unique_sum=$(wc-l啊,我想如果我在awk之外设置一个变量,它就可以设置了。谢谢你清理了它。现在也更干净了!
awk -F" - " -v date="$YESTERDAY" -v patt="$1" '$0 ~ date && $0 ~ patt {print $1}' "$ACCESSLOG"
unique_output=$(
    awk -F" - " -v date="$YESTERDAY" -v patt="$1" '
        $0 ~ date && $0 ~ patt {print $1}
    ' "$ACCESSLOG" | sort | uniq -c
)
echo "$unique_output"
unique_sum=$( wc -l <<< "$unique_output" )
echo "     $unique_sum total"