在 bash 脚本中使用 AWKing SSH 命令会产生错误的输出

在 bash 脚本中使用 AWKing SSH 命令会产生错误的输出

我正在尝试从一个简单的 bash 脚本中提取信息,该脚本从 java 服务器中提取一些数据。当 SSH 变量在脚本中运行时,我似乎无法运行awk它来提取我需要的信息,除非我将其写入本地文件。这是我正在处理的内容:

check=$(ssh [email protected] "/usr/local/bin/check_mq.sh")
ret=$?
cat=/bin/cat
awk=/usr/bin/awk
output=$($cat $check | $awk -F= '{print $4}' | $awk '{print $1}')
echo $output

如果我只是echo $check在脚本中出现这样的情况。

backchannel_queue messages=0 messages_ready=0 messages_unacknowledged=0 

但是,如果我将命令放入$check脚本中,awk它会给出以下输出:

/bin/cat: backchannel_queue: No such file or directory
/bin/cat: 'messages=0': No such file or directory
/bin/cat: 'messages_ready=0': No such file or directory
/bin/cat: 'messages_unacknowledged=0': No such file or directory

我已经能够通过写入$output系统上的文本文件来实现此工作:

 check_output="/home/user/Documents/scratch/check_output.txt"
 echo $check > $check_output
 output=$($cat $check_output | $awk -F= '{print $4}' | $awk '{print $1}')
 echo $output

我认为我在这里做错了什么,我不需要写入$output文件。或者,这是唯一的选择吗?一旦我将这个数字放入变量中,我计划使用一些IF语句来查看它是否大于x等。

答案1

你告诉它cat一个文件列表,该列表实际上是你想要它操作的东西,而不是文件。你想使用echo而不是cat这样做。

答案2

不要将您正在使用的命令的路径存储在变量中,这是完全没有必要的。如果您在非标准路径下使用工具(您没有这样做),请进行修改$PATH

您正在使用cat $check。对此需要注意两点:

  1. $check将对空白进行字段分割,将其变成多个单词。如果它们包含文件名通配字符,则它们将进行文件名通配。

  2. 结果单词将被提供给cat,它期望它们是文件名。这就是你的错误的来源。

相反,只需直接通过管道传递sshawk

ssh [email protected] "/usr/local/bin/check_mq.sh" |
awk -F '=' '{ print $NF }'

这假设您要输出=该行最后一个数字之后的数字。

如果你想测试这个数字是否大于某个变量$x

ssh [email protected] "/usr/local/bin/check_mq.sh" |
awk -F '=' -v x="$x" '$NF > x { printf("%d is more than %d\n", $NF, x) }'

答案3

使用echo而不是cat因为 your$check是一个变量。使用如下

check=$(ssh [email protected] "/usr/local/bin/check_mq.sh")
ret=$?
cat=/bin/cat
awk=/usr/bin/awk
output=$(echo $check | $awk -F= '{print $4}' | $awk '{print $1}')
echo $output

相关内容