我正在尝试使用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
答案 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