awk从另一个awk命令中输出系统调用

时间:2014-08-05 09:36:30

标签: bash awk

我已经接到了一项任务,就是在工作中收集一些有关计算机的信息,虽然我可以手动找到我已经确定的信息,但是我应该能够做到这一点。我有一个用户列表,访问资产数据库(其中包含有关机器中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}'")}'

当我尝试为ssh调用系统调用的结果时,它似乎会失败,并且在"中出现未终止的字符串错误。在$ NF之后...我不知道它是否应该在这里失败,或者如果我没有在系统调用等中逃避我应该做的事情 - 我已经尝试过随机插入\到处;)

我可以用" cat / proc / meminfo |替换free -m命令头-n 1"但是这会将输出放在一个单独的行上或者使用" free -m | grep Mem"但是当我只想要第二个字/总RAM量时,这就得到了整行。我真的很想将每个结果整齐地放在一条线上。

是否可以唤醒从另一个awk命令中进行的系统调用的输出?我知道我可以通过在变量中保存信息并从两个单独的命令构建输出行来在脚本中执行此操作,但是我顽固的大脑想知道如何尽可能地将其作为单行程执行!

2 个答案:

答案 0 :(得分:0)

你可以拥有:

"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}'\")}"

答案 1 :(得分:0)

除非“输出用户和设备信息的命令”打印出可变数量的字段,否则我真的不明白为什么你想要或需要这里的Awk。 (即使有不同数量的字段,也不难避免。)

"command that outputs user and device info" |
grep 'Dell\|HP' |
# assuming four fields, but easy to adapt, obviously
read -r user _ _ host; do
    printf "%-10s %s %d\n" "$user" "$host" $(\
       ssh "$host" free -m | awk '/Mem/ { print $2 }')
done

这具有在同一行输出中内联输出的额外好处,我理解这是您的偏好。 (同样,如果没有,很容易改变。显然,你的原始解决方案也可以适应同样容易的行为。)

如果你想让Awk对初始命令的输出进行后期处理,你仍然可以避免嵌套的Awk调用,这种调用更加优雅,可读性更强,更易于维护。

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

Obvioulsy,这里的一个重要观察是printf(也)是一个shell命令,所以你不需要Awk来进行打印格式化。