如何在shell脚本中添加`watch'命令?

时间:2011-08-19 23:54:52

标签: bash function watch

我有一个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'上移开了。我的剧本没有必要。

3 个答案:

答案 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>有帮助吗?

man tail