先上代码
#!/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,转载请注明。