Linux awk-将总和发送到全局变量
我在bash脚本中有一行代码,它计算到某个页面的唯一IP请求的总和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-
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"