gpt4 book ai didi

linux - 将 printf 重定向到 awk 中的文件

转载 作者:IT王子 更新时间:2023-10-29 00:46:28 26 4
gpt4 key购买 nike

我有一个简单的 bash 脚本。

目的是监控http访问日志文件(test.log)并将更新的命中率输出到文件(out.log):

  stdbuf -o0 tail -f test.log | awk -F'[ "]+' '{
ipcount[$1]++;
print "test" > "out.log"; #Truncate out.log
for (i in ipcount) {
printf "%15s - %d\n", i, ipcount[i] >> "out.log";
printf "%15s - %d\n", i, ipcount[i] }
}'

主要逻辑有效。我唯一的问题是重定向到“out.log”似乎不起作用。最后的 printf 将预期的结果输出到标准输出。但是另外两个 printf 没有输出任何东西到“out.log”,我不明白为什么。out.log 拥有所有权限(777)

最佳答案

这应该适合你:

tail -f test.log | awk -F'[ "]+' -v out_file="out.log" '{
val_count[$1]++
print "" > out_file

for (i in val_count) {
printf "%15s - %d\n", i, val_count[i] >> out_file
printf "%15s - %d\n", i, val_count[i]
}

close(out_file)
}'

(注意:我将输出文件定义移至命令行以希望减少重复。)

您的原始版本有一个致命问题:print ""> "out.log" 仅在 第一次 截断 out.log叫。对它的所有后续调用都将简单地附加到它,因为它已经打开。作为次要问题,awk 喜欢缓冲输出,因此内容只会间歇性地刷新。

要解决此问题,我们需要在每次迭代后关闭 文件。这会强制将输出刷新到 out.log 并强制 > 重定向以在下一次迭代时重新截断文件。如果您不需要截断每次迭代,一个简单的 fflush(out_file) 就足够了。


为了更清楚地说明问题...

这导致 output.txt 具有多行,因为它只被截断一次(第一次迭代):

ls -l | awk '{ print "This file has many lines" > "output.txt"; }'

这导致 output.txt 具有单个 输出行,因为它被截断了多次:

ls -l | awk '{ print "This file has one line" > "output.txt"; close("output.txt"); }'

关于linux - 将 printf 重定向到 awk 中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31861398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com