我有一个脚本,可以 greps 和 awks 并计算具有多个 http 状态代码的 IP 地址。脚本是什么并不重要,因为我的目标如下:
我想在这个脚本中调用“watch”命令,以便每隔几秒钟使用从动态 apache 日志接收到的新数据更新显示。
我可以按如下方式调用我的脚本:
$ watch --no-title ./bad_request.sh
但我更愿意在脚本本身中包含“watch”命令,以使从命令提示符调用脚本更加简洁。
这是脚本:
#!/bin/bash
#identify repeated offenders through 401 and 403 status codes
for ip in `awk '{print $1}' /var/log/apache2/* | sort -u`; do echo -n "$ip "; awk '{print $1 " " $9}' /var/log/apache2/* | egrep "( 401| 403)"| grep -c $ip; done | sort -k2 -r
现在,我尝试在脚本中插入“watch -d --no-title”,就在 for 循环之前,但它会愤怒地出错。我认为这是因为它只处理直到它到达第一个命令的末尾。我也尝试在整个脚本周围加上反引号和 $()。我还尝试将大部分脚本设为 bash 函数,并在该函数上调用 watch。没有骰子。
有任何想法吗?
顺便说一句,我也对脚本的改进持开放态度——我确实意识到它有点多余/效率低下。当然,这可能应该留给不同的 Stack Overflow 问题。
谢谢,
凯文
编辑:还有一件事,我可以打电话while true; do <bulk of script>; sleep 1; clear;
,但我讨厌这样。它有效,但屏幕闪烁,这不是正确的方法。
编辑2:另一个有效的讨厌的黑客是简单地创建两个脚本。第一个是:
watch --no-title ./bad_request
然后只需调用该脚本。这很好用,但必须有更好的方法。
编辑 3(对不起...):我从“watch”中去掉了 -d 标志。我的脚本没有必要。