
我有一個如下所示的文件:
**********************************
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
因為您不使用擴展正則表達式。