Bash
如何在每次輸入更新時覆蓋輸出文件
我有一個來自串列輸入(GPS 天線)的資訊流,並希望在每個輸入(在這種情況下是每秒)上將該資訊輸出到一個文本文件中,而不是像 > 之後那樣將其附加到文件的末尾初始覆蓋我希望它每秒覆蓋一次,因此只顯示最新資訊。
我嘗試了 \r ,它在 bash 中實現了效果,但在輸出文件中沒有。
cat /dev/ttyACM0 | grep --line-buffered -E "GNGGA" | awk 'BEGIN {FS=","};{printf "%s%s\t\t%s%s\t\t%s%s\t%s%s","Time= ",$2,"Lat= ",$3,"Lon= " ,$5,"Alt= " ,$10; fflush(stdout) }' > somefiles.txt
這包括初始輸入、專注於一行的 grep 和 awk 以獲取我需要的資訊的特定部分,據我所知,它們不會影響覆蓋問題。
Time= 155325.00 Lat= 7428.77433 Lon= 82845.15963 Alt= 21.5
這是從覆蓋 somefiles.txt 開始的輸出,但隨後會追加,直到您停止並再次執行該命令。
那麼有沒有辦法讓最新的輸入在文本文件中顯示為一行?
謝謝
您可以
printf
直接到 中的文件,並在awk
每次寫入後關閉它。這將awk
在下一次列印時重新打開並截斷它。awk -vfile=test.out '{print $0 > file; close(file)}'
(嚴格來說,你在這裡遇到了一個競爭條件,另一個程序可能會嘗試在截斷和寫入之間讀取文件,所以它看起來是空的(或者更糟但不太可能,部分)。)