我有一个如下所示的文件:
**********************************
Some notes are here
Year Month Day Hour Minute Second
. . . . . . . . . . . . . . . . .
在此之下,我希望使用以下代码显示日期
#!/bin/bash
for timestamp in (1262300400..1264978800..600)
do
date -d @"$timestamp" '+%Y %m %d %H %M %S';
done | grep -Ev '[15]0 00$' > file.txt
如果您想知道我如何获得此代码,请阅读问题日期范围(分钟)
这道题的难点在于最后一部分"> file.txt"
。当前代码将覆盖 file.txt 中已有的内容。我希望这个循环打印文件“file.txt”注释下方的日期,因此它可以从第 5 行或其他位置开始写入。
所以期望的输出是
**********************************
Some notes are here
Year Month Day Hour Minute Second
. . . . . . . . . . . . . . . . .
2010 01 01 00 00 00
2010 01 01 00 20 00
2010 01 01 00 30 00
2010 01 01 00 40 00
2010 01 01 01 00 00
答案1
重定向使用>
将创建您重定向到的输出文件,或者,如果它已经存在,则会将其截断为零大小。对文件的任何写入都将从文件的开头开始,并且数据将按顺序写入。这是不是你想做什么。
重定向使用>>
将创建输出文件,或者,如果它已经存在,将不是截断它。对文件的任何写入都将发生在文件末尾。这就是您想要做的。
此外,您的代码中存在语法错误。我假设您想在循环中使用大括号扩展:
#!/bin/bash
for timestamp in {1262300400..1264978800..600}; do
date -d @"$timestamp" '+%Y %m %d %H %M %S'
done | grep -v '[15]0 00$' >>file.txt
另外,这是一个极其缓慢的循环,调用date
大量的次数(准确地说,是 4465 次;一个月 31 天的 10 分钟时间段的数量)。为了加快速度,请利用 GNUdate
可以从文件中读取的事实(在这里,我们在标准输入上提供时间戳,它date
使用 读取-f -
):
#!/bin/bash
printf '@%s\n' {1262300400..1264978800..600} |
date -f - '+%Y %m %d %H %M %S' |
grep -v '[15]0 00$' >>file.txt
这将在一秒或更短的时间内运行。
-E
我还从 的调用中删除了,grep
因为您不使用扩展正则表达式。