另一个解析bash脚本输出到变量

时间:2014-03-05 04:16:33

标签: bash

我知道以前曾经问过这个问题,而且我已经看了以前的帖子,但似乎无法得到我想要做的工作。

我知道这是非常基本的,所以我希望这对大多数人来说都很容易。

我想创建一个ping地址的简单bash脚本,然后将ping输出插入到csv文件中(或者更确切地说,插入到用逗号分隔的文件中)。

ping命令是

ping -D google.com

,输出看起来像

PING google.com (74.125.239.103) 56(84) bytes of data.
[1393992465.052723] 64 bytes from nuq05s01-in-f7.1e100.net (74.125.239.103): icmp_req=1 ttl=55 time=2.66 ms

我想将纪元时间,时间和时间插入文件,用逗号分隔。 如果它足够简单,那么将时间转换为日期也不会有什么坏处,但这可以是我在这个简单项目中的下一步。

我发现将纪元时间转换为人格式的命令是

date -d @[epoch_time]

侧面琐事 - 为什么我需要@?

1 个答案:

答案 0 :(得分:1)

ping -D google.com | sed -n -e 2p -e 2q |
while read epoch b64 bytes from host ip icmp ttl time ms
do
    date=$(date -d @$(sed 's/[][]//g' <<< "$epoch"))
    ttl=$(sed 's/ttl=//' <<< "$ttl")
    time=$(sed 's/time=//' <<< "$time")
    echo "$date,$ttl,$time"
done >> file.csv

显然,您可以通过调整第一个sed命令来扩展分析的行数。您可以使用${var/x/y}表示法在循环内进行编辑,但是在我最后写完之前我不会想到这样做因为我花了更长时间处理那些不是比我bash的选项。您确定不需要主机或IP地址信息吗?


在早晨的冷光下,有一种简单的方法来改进代码:

ping -D google.com | sed -n -e 2p -e 2q |
while read epoch b64 bytes from host ip icmp ttl time ms
do
    epoch=${epoch#[}
    epoch=${epoch%]}
    date=$(date -d @${epoch})
    echo "$date,${ttl#ttl=},${time#time=}"
done >> file.csv

选择是创建date变量还是直接在$(date -d @${epoch})参数中嵌入echo,这是一个选择问题。