简短问题:更新文件中单个编号变量的最有效方法是什么?
长问题:我正在查看安全程序(fail2ban)的输出,该程序记录了哪些主机因各种原因而被添加到 Linux 防火墙中。 fail2ban 允许在检测到违规者时执行自定义操作 [1],并且我打算简单地增加文件中的变量。稍后将通过访问该文件的不同服务器使用该文件,以按尚不可知的时间间隔显示该数字。
我打算使用 awk/gawk 加载文件,获取变量,添加一个,然后将其保存到位。
为了节省 VPS 上过多的磁盘写入和 CPU 使用率,最有效的方法是什么,当在 fail2ban 中注册某些内容时,获取文件中的任何数字,递增它并以最有效的方式将其写回同一个文件可能的方式(磁盘 IO、内存使用或 CPU 利用率)。
[1] - Fail2Ban 提供以下操作,其中可以添加命令行参数。这是我希望添加我的高效片段的地方。
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = awk...
actionunban = awk..
*如果解禁可以以同样高效的方式运行并且相反(减少数量),则可获得奖励积分
答案1
在文件中递增数字的超快速方法可能是:
awk -F, '{$0=$0+1}1' OFS=, failtoban.txt >tmp; mv tmp failtoban.txt
为了减少您可以执行的操作:
awk -F, '{$0=$0-1}1' OFS=, failtoban.txt >tmp; mv tmp failtoban.txt
但是,这没有考虑到同时增量或减量太快的情况。
实际上,在做了一些小更改之后,您可以这样做,即就地修改文件:
增量:
awk -i inplace '{ print $0=$0+1 }' failtoban.txt
递减:
awk -i inplace '{ print $0=$0-1 }' failtoban.txt
根据埃德·莫顿的评论,这一切都可以做得更聪明:
增量:
awk -F, '{++$0}1' OFS=, failtoban.txt >tmp; mv tmp failtoban.txt
递减:
awk -F, '{--$0}1' OFS=, failtoban.txt >tmp; mv tmp failtoban.txt
增量:
awk -i inplace '{ print ++$0 }' failtoban.txt
递减:
awk -i inplace '{ print --$0 }' failtoban.txt