先上代码
#!/bin/bash
LOG_FILE="你需要监听的日志文件"
PATTERN_1="监听到什么字符就触发"
PATTERN_2="JVM running for"
SCRIPT_1="需要执行的sh脚本"
SCRIPT_2="/em.sh"
last_line_1=""
last_line_2=""
tail -n0 -F "$LOG_FILE" | while read -r line; do
if [[ $last_line_1 != "$line" ]]; then
if echo "$line" | grep -q "$PATTERN_1"; then
sh "$SCRIPT_1"
fi
last_line_1="$line"
fi
if [[ $last_line_2 != "$line" ]]; then
if echo "$line" | grep -q "$PATTERN_2"; then
sh "$SCRIPT_2"
fi
last_line_2="$line"
fi
done
关键位置详细解释
<pre>
tail -n0 -F "$LOG_FILE" | while read -r line; do
if [[ $last_line_1 != "$line" ]]; then
if echo "$line" | grep -q "$PATTERN_1"; then
sh "$SCRIPT_1"
fi
last_line_1="$line"
fi
if [[ $last_line_2 != "$line" ]]; then
if echo "$line" | grep -q "$PATTERN_2"; then
sh "$SCRIPT_2"
fi
last_line_2="$line"
fi
done
</pre>
这部分代码是一个循环结构,用于实时监听日志文件的内容,并根据条件触发相应的脚本执行。下面是代码的详细解释:
tail -n0 -F "$LOG_FILE": 使用tail命令来实时监视指定日志文件的内容。-n0表示从文件末尾开始读取,-F表示跟踪文件的变化并实时输出新的内容。| while read -r line; do: 通过管道将tail命令的输出传递给while循环,并使用read命令将每行内容赋值给变量line。if [[ $last_line_1 != "$line" ]]; then: 检查当前读取的行是否与上一次读取的行不同,如果不同,则执行下面的语句块。if echo "$line" | grep -q "$PATTERN_1"; then: 使用echo命令将当前行的内容输出,并通过管道传递给grep命令,查找是否匹配模式1$PATTERN_1。-q选项用于静默模式,不输出匹配结果。sh "$SCRIPT_1": 如果模式1匹配成功,则执行指定的脚本1。last_line_1="$line": 将当前行赋值给变量last_line_1,以便在下一次循环中进行比较。if [[ $last_line_2 != "$line" ]]; then: 检查当前读取的行是否与上一次读取的行不同,如果不同,则执行下面的语句块。if echo "$line" | grep -q "$PATTERN_2"; then: 使用echo命令将当前行的内容输出,并通过管道传递给grep命令,查找是否匹配模式2$PATTERN_2。sh "$SCRIPT_2": 如果模式2匹配成功,则执行指定的脚本2。last_line_2="$line": 将当前行赋值给变量last_line_2,以便在下一次循环中进行比较。
这个循环会持续监听日志文件的变化,每当出现匹配的模式时,对应的脚本将被执行。
本文作者为DBC,转载请注明。
