Bash 来自另一个awk命令的系统调用的awk输出

Bash 来自另一个awk命令的系统调用的awk输出,bash,awk,Bash,Awk,我的任务是收集一些关于工作中的许多计算机的信息,虽然我可以手动找到这些信息,但我决定用一个线性程序来完成。我有一个用户列表,可以访问一个资产数据库(关于机器中有多少RAM的信息不正确),并希望打印一个列表,其中每行列出用户名、主机名和RAM数量。我已经设法得到了我需要输出的信息,但是我很恼火,我不能像我希望的那样很好地输出它 下面是我本想使用的命令: "command that outputs user and device info" | grep 'Dell\|HP' | awk '{pri

我的任务是收集一些关于工作中的许多计算机的信息,虽然我可以手动找到这些信息,但我决定用一个线性程序来完成。我有一个用户列表,可以访问一个资产数据库(关于机器中有多少RAM的信息不正确),并希望打印一个列表,其中每行列出用户名、主机名和RAM数量。我已经设法得到了我需要输出的信息,但是我很恼火,我不能像我希望的那样很好地输出它

下面是我本想使用的命令:

"command that outputs user and device info" | grep 'Dell\|HP' | awk '{printf "%-10s %s\n",$1,$NF,system("ssh " $NF " free -m | grep Mem | awk '{print $2}'")}'
当我尝试awk ssh系统调用的结果时,它似乎失败了,在“after$NF…我不知道它是否应该在这里失败,或者如果我没有在系统调用中逃避我应该做的事情,等等-我已经尝试插入random\everywhere;)

我可以用“cat/proc/meminfo | head-n1”替换free-m命令,但这会将输出放在单独的一行上,或者用“free-m | grep Mem”替换,但当我只需要第二个字/总内存量时,这会得到整行。我真的希望每个结果都整齐地放在一行上

是否可以通过另一个awk命令来awk系统调用的输出?我知道我可以通过在变量中保存信息并从两个单独的命令中构建一个输出行来在脚本中实现这一点,但我固执的大脑想知道如果可能的话,如何以一行代码的形式实现这一点!

你可以做到:

"command that outputs user and device info" | \
    grep 'Dell\|HP' | \
    awk "{printf \"%-10s %s\\n\",\$1,\$NF,system(\"ssh \" \$NF \" free -m | grep Mem | awk '{print \$2}'\")}"
或者简单地说:

"command that outputs user and device info" | \
    awk "/Dell|HP/ {printf \"%-10s %s\\n\",\$1,\$NF,system(\"ssh \" \$NF \" free -m | awk '/Mem/ {print \$2}'\")}"
除非“输出用户和设备信息的命令”打印的字段数量可变,否则我真的不明白您为什么想要或需要Awk(即使字段数量可变,也不难避免)

这还有一个额外的好处,就是将内存输出内联到同一行输出中,我知道这是您的偏好。(同样,如果没有,很容易更改。显然,您的原始解决方案也可以调整为以同样的方式轻松工作。)

如果您希望使用Awk对初始命令的输出进行后处理,那么仍然可以避免嵌套的Awk调用,因为IMHO更优雅、可读性更强,而且更易于维护

"command that outputs user and device info" |
awk '/Dell|HP/ { print $1, $NF }' |
while read -r user host; do
    :

显然,这里的一个关键观察结果是,
printf
也是一个shell命令,因此打印格式不需要Awk。

您应该一步一步地尝试,首先使用几个函数,然后将其组合成一行。您的问题可能在于嵌套的引号。请尝试
ssh\$NF free-m。。。“
在特殊字符之前使用“\”,例如:$Thank bachN…我已经尝试过了\但可能不在正确的位置,因为我不确定“{和$中的哪一个会被视为特殊字符。我会在早上回去工作时再试一次。同样感谢Ploutox…如果我放下
|awk'{print$2},整个过程都会正常。”“
从末尾开始。嵌套的引号可以很好地使用$NF作为SSH命令的主机名,我的问题只有在我尝试在SSH命令的输出中使用grepping for Mem来awk输出时才会出现。如果我删除awk,我会得到一行带有用户名和主机名的代码,然后当我只需要第二个单词时,whoe Mem行将免费/RAM amountawk'line1;line2;line3'infle | awk'cmd4;cmd5;cmd6'工作感谢…虽然我仍然在单独的一行中获取RAM编号,显示在包含用户名和主机名的行之前,但我至少只获取了我要查找的数据:)
"command that outputs user and device info" |
awk '/Dell|HP/ { print $1, $NF }' |
while read -r user host; do
    :