在另一个脚本的输出上调用awk

时间:2016-02-28 23:32:08

标签: bash awk

我正在尝试使用awk搜索特定行的脚本输出。有人可以解释为什么这不会返回输出:16.72

我的bash脚本:

speed=$(./speedtest-cli)
awk '/Download:/ {print $2}' $speed

SPEEDTEST-CLI

pi@raspberrypi ~/Desktop/PiControl $ ./speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Charter Communications (xxxxxx)...
Selecting best server based on latency...
Hosted by Charter Communications (yyyy, zz) [67.01 km]: 44.035 ms
Testing download speed........................................
Download: 16.72 Mbit/s
Testing upload speed..................................................
Upload: 3.45 Mbit/s

注意(包括在下面的评论中)我试图避免单行,因为我打算从输出中打印多行。

编辑:

澄清我的最终目标。我正在尝试运行./speedtest-cli(我试图不更改此文件)。我试图获取其输出(下载速度,上传速度和延迟)并将它们作为单独的参数传递给另一个将它们写入数据库的脚本。 (这个项目纯粹是供个人使用....我不想在企业环境中使用它)

从上面的speedtest-cli输出我想这样做:

我的目标:

./another_script 16.72 3.45 44.035 

3 个答案:

答案 0 :(得分:3)

你的要求非常模糊(全局 - 你告诉我们你想做什么,但不想做你想做的事)但可能这就是你想要的:

./speedtest-cli | awk -F': *' '/Download|Hosted by Charter Communications/{print $2}'
44.035 ms
16.72 Mbit/s

答案 1 :(得分:2)

首先,回答你的问题:

speed=$(./speedtest-cli)
awk '/Download:/ {print $2}' <<< "$speed"

其次,这几乎肯定不是你真正需要的。例如,您可以在bash内构建所需的调用,然后使用awk的system函数,或者可以回显整个调用。

另一种方法是将感兴趣的值分配给bash数组,方法如下:

 a=( $(./speedtest-cli | awk -F ....) )

答案 2 :(得分:1)

您已声明这是您的bash脚本:

#!/bin/bash

speed=$(./speedtest-cli)
awk '/Download:/ {print $2}' $speed

这会失败,因为您没有给awk解析任何内容。您正在设置一个变量以包含命令的输出,但后来将该变量视为文件名。

Awk的命令行格式大致如下:

awk [options] awkscript [file ...]

$speed是一个文件吗?不,不是。

根据您的问题的编辑,看起来您尝试做的只是删除从speedtest-cli命令输出的数字。如果可以编辑可以获取这些数字的脚本,并且不需要按照您指定的顺序选择,那么最快的解决方案可能是这样的:

/path/to/speedtest-cli | egrep -o '[0-9]+\.[0-9]+' | xargs /path/to/anotherscript

这将获取speedtest-cli的输出,删除不是十进制数的所有内容,然后将这些数字作为anotherscript的选项。对于您提供的示例输入,这相当于运行

anotherscript 67.01 44.035 16.72 3.45