我的資料夾中有一堆 .tcx 檔案(本質上是 GPS 裝置輸出的 XML 檔案)。它們遵循命名約定 DATE_LOCATION_SPORT.tcx。每個檔案都有一堆追蹤點節點,記錄每秒記錄的關鍵 GPS 數據,其中有一個子節點,稱為「DistanceMeters」。我想 grep 遍歷每個文件,找到最後一個“DistanceMeters”節點,然後輸出該距離列表。這是文件的片段。 (我使用的是 OS X Sierra 終端)
…
<Trackpoint>
<Time>2017-04-09T08:15:29.000Z</Time>
<Position>
<LatitudeDegrees>0.123456</LatitudeDegrees>
<LongitudeDegrees>-0.654321</LongitudeDegrees>
</Position>
<AltitudeMeters>24.363636363636363</AltitudeMeters>
<DistanceMeters>1382.3235298511217</DistanceMeters>
<HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t">
<Value>130</Value>
</HeartRateBpm>
</Trackpoint>
…
我一開始嘗試只使用一個文件來執行此操作(請注意,某些文件名中有空格,不確定這是否會讓我困惑);
grep '<DistanceMeters>.*<\/DistanceMeters>' '2017-03-23_Somewhere_Running.tcx' | tail -1 | grep -o '[0-9]\+\.[0-9]\+'
它很好地獲取了最後一個“DistanceMeters”節點,然後使用 grep 提取數字距離而不是整行 xml。
find . -iname '2017*_Running.tcx'
上面列出了我今年感興趣的所有文件。
但當我嘗試組合這些命令時,一切都崩潰了。我要么收到關於不以“\;”結尾的錯誤或者,我得到一個答案,但只有文件列表中最後一個文件的最後一個距離值,而不是每個文件的距離。
所以這給了我列表中最後一個文件的最終距離;
find . -iname '*_Running.tcx' -print0 | xargs -0 grep '<DistanceMeters>.*<\/DistanceMeters>' | tail -1 | grep -o '[0-9]\+\.[0-9]\+'
正如這個;
find . -iname '*_Running.tcx' -exec grep '<DistanceMeters>.*<\/DistanceMeters>' {} \; | tail -1 | grep -o '[0-9]\+\.[0-9]\+'
我嘗試過各種組合,但我不確定如何以我需要的方式組合它們。我想也許可以加上“\;”最後會做到這一點,但這不起作用 - 抱怨沒有以“;”結尾或“+”。
find . -iname '*_Running.tcx' -exec grep '<DistanceMeters>.*<\/DistanceMeters>' {} | tail -1 | grep -o '[0-9]\+\.[0-9]\+' \;
產量
grep: ;: No such file or directory
find: -exec: no terminating ";" or "+"
有任何想法嗎?
感謝您閱讀本文!
答案1
這裡的問題是引用......我不知道是否有一種方法可以正確引用它,以便 find(1) 的 'exec' 選項能夠接受命令管道。
這是解決該問題的一種方法:
$ for rfile in $(find . -iname '2017*_Running.tcx'); do grep '<DistanceMeters>.*<\/DistanceMeters>' $rfile | tail -1 | grep -o '[0-9]\+\.[0-9]\+'; done