从 awk 条件重定向消息

从 awk 条件重定向消息

我想在检查从我的服务器到日志文件的连接时重定向我的自定义消息。我使用 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变体(至少mawkgawk)用作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/stderrinside awk

相关内容