如何通过管道将输出传输到 date -d “value”?

如何通过管道将输出传输到 date -d “value”?

我有一个像 的日期2014-01-30 05:04:27 GMT,如果我运行date -d "2014-01-30 05:04:27 GMT",输出将以我服务器的时区 ( Thu Jan 30 16:04:27 EST 2014) 为单位。

通过使用 grep 和 cut,我从文件中提取了 GMT 日期。但是,我很难将其转换为我的本地时间。

例如:

grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'['

输出:2014-01-30 05:04:27 GMT

我可以在最后添加什么来将该输出传递给date -d

尝试:

grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[' | date -d
grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[' | date
grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[' | date -d "$1"

答案1

gmt="$(grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[')"
date -d "$gmt"

或者,如果您更喜欢管道格式:

grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[' | { read gmt ; date -d "$gmt" ; }

问题是date不使用 stdin。因此,我们必须将 stdin 捕获到一个变量(gmt此处称为)中,然后在命令行上将其提供给date

第二种方法的示例输出:

$ echo  "2014-01-30 05:04:27 GMT" | { read gmt ; date -d "$gmt" ; }
Wed Jan 29 21:04:27 PST 2014

答案2

date -f如果您使用的是来自足够新的 coreutils 的 GNU 日期,则在帮助屏幕上有:

-f, --file=DATEFILE       like --date once for each line of DATEFILE

因此你的第四次尝试可能是:

$ grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[' | date -f -

最后一个-代表标准输入。

答案3

只需使用标准输入作为文件

command | date --file=-

相关内容