3

我有一个脚本,可以 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 标志。我的脚本没有必要。

4

3 回答 3

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 哲学,那么您已经有了一个脚本来执行此操作。

你已经看到了试图让脚本同时做太多事情的一种复杂情况——引用地狱。

把事情简单化。

于 2011-08-20T00:59:10.600 回答
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"
于 2011-08-20T00:24:34.773 回答
0

tail -f <file>帮助吗?

人尾巴

于 2011-08-20T01:20:50.833 回答