
我有來自串行輸入(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 的輸出,然後追加直到您停止並再次運行該命令。
那麼有沒有一種方法可以讓最新的輸入只在文字檔中顯示為一行呢?
謝謝
答案1
你可以print
或printf
直接到文件內awk
,並在每次寫入後關閉它。這將awk
在下一次列印時重新打開並截斷它。
awk -vfile=test.out '{print $0 > file; close(file)}'
(嚴格來說,您在這裡遇到了競爭條件,另一個進程可能會嘗試讀取該文件只是在截斷和寫入之間,所以它看起來是空的(或更糟但不太可能是部分的)。