我有一个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
现在,我尝试在for循环之前在脚本中插入“watch -d --no-title”,但是它出错了。我认为这是因为它只是处理直到它到达第一个命令的末尾。我已经尝试在整个脚本周围添加反引号和$()。我也尝试使脚本的大部分成为bash函数,并在函数上调用watch。没有骰子。
有什么想法吗?
顺便说一句,我也对脚本的改进持开放态度 - 我确实意识到它有点多余/低效。当然,这可能应该保留给不同的Stack Overflow问题。
谢谢,
凯文
编辑:还有一件事,我可以打电话给while true; do <bulk of script>; sleep 1; clear;
,但我讨厌这个。它有效,但屏幕闪烁,这不是正确的方法。
编辑2:另一个令人讨厌的黑客行为,就是简单地创建两个脚本。第一个是:
watch --no-title ./bad_request
然后只需调用该脚本即可。这很好,但必须有更好的方法。
编辑3(对不起......):我把-d标志从'watch'上移开了。我的剧本没有必要。
答案 0 :(得分:3)
注意unix哲学:
A program should do one and only one thing and do it well.
适用于您的案件:
A script should do one and only one thing and do it well.
你的“讨厌的黑客”实际上是朝着正确方向迈出的一步。
你永远不会知道是否有一天你需要在另一个剧本上“观看--no-title”。那时如果你遵循unix哲学,你已经有了一个脚本来做到这一点。
你已经看到一个复杂的尝试让一个脚本一次做太多事情 - 引用地狱。
保持简单。
答案 1 :(得分:1)
正确的用法是:
watch -d --no-title "/bin/bash 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"
答案 2 :(得分:0)
tail -f <file>
有帮助吗?