我想在检查从我的服务器到日志文件的连接时重定向我的自定义消息。我使用 exit 1 打破条件,但如何使其更详细并重定向到日志文件?
我怎样才能在其内部实现这一点awk
,以很好地适应消息与重定向:
awk { ... "Connectivity to ${rda} failed, exiting" >> ${log} ... } then
我的脚本如下:
#/bin/bash
rda="www.google.com"
log="/var/log/connectivity.log"
if nc -zw1 ${rda} 22 && echo |openssl s_client -connect ${rda}:22 2>&1 |awk '
handshake && $1 == "Verification" { if ($2=="OK") exit;exit 1; }
$1 $2 == "SSLhandshake" { handshake = 1 }'
then
echo -e "Connectivity works" >> ${log}
exit 0
fi
我的 awk 版本是:
# awk -W version mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits: max NF 32767 sprintf buffer 2040
答案1
您可以使用print
中的文件awk
print "data" >"somefile.log"
或者
filename="somefile.log"
print "data" >filename
使用>
将在第一个上截断文件print
,但文件将保持打开状态,直到脚本结束或您显式地close()
打开文件。当文件打开时(在第一个之后print >
),后续调用print >
将添加到文件而不截断。
要附加到现有文件,请使用print >>
.
从命令行使用日志文件名的示例:
... | awk -v out="$log" { print "this is a message" >>out }
或者,
... | out=$log awk { print "this is a message" >>ENVIRON["out"] }
上面的代码将附加到(可能)预先存在的文件(其路径名位于 shell 变量中)log
。第二个示例使用环境变量 out
$log
作为要写入的文件路径(这在命令行上设置为awk
)。
答案2
正如已经描述的,您可以使用此构造来写入(并继续写入)文件:
awk '{ print "hello, world" >>"file.log" }'
难题的另一部分是如何在不使用复杂引用的情况$log
下获取 shell 变量。awk
该-v
标志允许您定义一个awk
变量,在本例中我们将其设置为 shell 变量的值$log
:
awk -v logfile="$log" { print "Appending to", logfile, "here" >>logfile }'
(我没有使用,log="$log"
因为awk
变体(至少mawk
和gawk
)用作log
内置并且不允许重新定义它。)
答案3
您可以将所有日志记录合并到一个awk
脚本中。尝试调整你的脚本,例如
awk -v rda="${rda}"'
handshake &&
$1 == "Verification" {if ($2=="OK") {print "Connectivity works"
exit
}
print "Connectivity to " rda " failed, exiting"
exit 1
}
$1 $2 == "SSLhandshake" {handshake = 1
}
' >> "${log}"
如果您想区分正常输出和错误输出,请将错误重定向到/dev/stderr
inside awk
。