我正在运行以下命令:
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"
将第一个命令括起来`
允许您将其输出用作另一个命令的一部分。如果第一个命令的输出碰巧包含空格或特殊字符,则将其包围起来有助于"
防止出现复杂情况。