One Liner sed 日期字符串到 unixtime

One Liner sed 日期字符串到 unixtime

我正在运行以下命令:

cat /tmp/myfile.log | sed -n -e 's/^.*Expire: //p'

返回以下字符串

04-nov-2018

然后我想通过以下命令运行该字符串:

date -d '04-nov-2018' + "%s"

这将返回 unixtime:

1541304000

如何在单个命令行中运行它?

答案1

你可以在 a 中运行命令$( ),这样你就可以直接说:

date -d "$(command)" + "%s"

在你的情况下:

date -d "$(sed -n -e 's/^.*Expire: //p' /tmp/myfile.log)" + "%s"

另请注意,我说的是sed '...' file而不是cat file | sed '...',因为sed可以直接从文件中读取。

答案2

由于您似乎拥有 的 GNU 实现date,因此您可以执行以下操作:

</tmp/myfile.log sed -n 's/^.*Expire: //p' | date -f - +%s

使用 GNU sed(并且仍然是 GNU date),您还可以执行以下操作:

</tmp/myfile.log sed -n 's/^.*Expire: /date +%s -d/ep'

(假设 POSIXLY_CORRECT 不在环境中)

Expire:但请注意,如果您无法保证任何标记后面的内容不是该格式的日期,则这相当于命令注入漏洞。尽管更短,但它的效率也比上面低很多,因为它date为每个匹配行运行一个 shell 和一个命令(并通过管道检索其输出,以便稍后在标准输出上再次输出)。

在非 GNU 系统上,您可以使用perl

</tmp/myfile.log perl -MTime::Piece -lne '
  print Time::Piece->strptime($1, "%d-%b-%Y")->epoch if /Expire: (\S+)/'

zsh或者,如果使用(strftime -r内置) 或ksh93( printf %T)等高级功能,请使用 shell 的日期解析功能。

答案3

使用替换:

date -d "`cat /tmp/myfile.log | sed -n -e 's/^.*Expire: //p'`" + "%s"

将第一个命令括起来`允许您将其输出用作另一个命令的一部分。如果第一个命令的输出碰巧包含空格或特殊字符,则将其包围起来有助于"防止出现复杂情况。

相关内容