如何找到可能分布在多个日志文件中的最后有效信息

如何找到可能分布在多个日志文件中的最后有效信息

我有一个公交车队,每天早上都会给我发送一份有关前一天车辆状况的监控日志文件。日志每 5 分钟更新一次各种信息。收集的数据包括 GPS 坐标。

经度和纬度用不同的行表示。每辆车的日志都存储在一个单独的文件夹中。此文件夹中有一个包含所有日志文件的子文件夹。每个日志文件都以“监控”开头,然后是创建日期和时间。所以我在这个文件夹中每天都有一个日志文件。

文件示例:

07-15 15:48:28.064 [INFO ] dataset.up.throughput : 0
07-15 15:53:16.425 [INFO ] system.disk.used.total : 731 MB
07-15 15:53:16.426 [INFO ] system.mem.used.total : 458 MB
07-15 15:53:16.427 [INFO ] system.cpu.usage : 9,99
07-15 15:53:16.520 [INFO ] msg.nbr.expired : 0
07-15 15:53:16.521 [INFO ] msg.nbr.received : 0
07-15 15:53:16.522 [INFO ] msg.send.throughput : 0
07-15 15:53:16.523 [INFO ] msg.received.throughput : 0
07-15 15:53:16.590 [INFO ] dataset.nbr.jobs.queue : 6
07-15 15:53:16.590 [INFO ] dataset.nbr.jobs.inprogress : 6
07-15 15:53:16.590 [INFO ] dataset.nbr.jobs.expired : 0
07-15 15:53:16.590 [INFO ] dataset.down.throughput : 0
07-15 15:53:16.590 [INFO ] dataset.up.throughput : 0
07-15 15:53:16.591 [INFO ] posn.altitude : 80.0 m
07-15 15:53:16.591 [INFO ] posn.longitude : 4° 18' 34"
07-15 15:53:16.591 [INFO ] posn.latitude : 50° 53' 35"
07-15 15:53:16.591 [INFO ] posn.speed : 23.55 m/s
07-15 15:53:16.591 [INFO ] posn.track : 235° 1' 30"
07-15 15:53:16.591 [INFO ] posn.source : GPS_DR
07-15 15:53:16.591 [INFO ] posn.timestamp : Wed Jul 15 13:53:15 CEST 2015
07-15 15:53:16.592 [INFO ] mpm.online : false
07-15 15:53:16.592 [INFO ] mpm.online.ts : 0
07-15 15:58:16.383 [INFO ] system.disk.used.total : 732 MB

通常我使用这样的 shell 命令:

find /path/to /vehicle/folder/vehicleID/ -type d -name 'FolerContainingLogFiles' -exec sh -c "ls {}/monitoring* -t | head -1 | grep "posn.l" {}/monitoring* | tail -2" >> /path/results.log ";" ;

在正常情况下,这种方法很有效,但有时公交车在停车场上只移动了很短的时间。在这种情况下,GPS 无法与卫星同步,因此记录会给我value = "0"经度和纬度。

问题就在这里:

  1. 如果最后一个坐标为“0”,那么我需要进入文件并尝试找到最后一个非零值。
  2. 有时,文件只有零值。在这种情况下,我需要转到上一个文件并开始寻找非零值,依此类推。

我尝试编写一个 bash 脚本,但由于某种原因无法获得正确的输出。

find $zoekPad -type d -name 'mobiguider-logs-archive' | while read line; do

cmdOutputLon=$(ls $line/monitoring* -t | head -1 | grep "posn.lo" $line/monitoring* | tail -1 )
lonDD=$(echo $cmdOutputLon | awk -F':' '{print $5}' | awk '{printf ("%.8f\n",$1+$2/60+$3/3600)}')
cmdOutputLon=$cmdOutputLon";"$lonDD
cmdOutputLat=$(ls $line/monitoring* -t | grep "posn.la" $line/monitoring* | tail -1)
latDD=$(echo $cmdOutputLat | awk -F':' '{print $5}' | awk '{printf ("%.8f\n",$1+$2/60+$3/3600)}')
cmdOutputLat=$cmdOutputLat";"$latDD
huidigeIndexStart=1
while [[ true ]]
do
    loopCount=1000
    cmdOutputLon=$(ls $line/monitoring* -t | grep "posn.lo" $line/monitoring* | sed -n $huidigeIndexStart,$huidigeIndexStart"p")
    echo $huidigeIndexStart
    lonDD=$(echo $cmdOutputLon | awk -F':' '{print $5}' | awk '{printf ("%.8f\n",$1+$2/60+$3/3600)}')
    cmdOutputLon=$cmdOutputLon";"$lonDD
    cmdOutputLat=$(ls $line/monitoring* -t | grep "posn.la" $line/monitoring* | sed -n $huidigeIndexStart,$huidigeIndexStart"p")
    latDD=$(echo $cmdOutputLat | awk -F':' '{print $5}' | awk '{printf ("%.8f\n",$1+$2/60+$3/3600)}')
    cmdOutputLat=$cmdOutputLat";"$latDD

    if ! [[ $cmdOutputLon =~ '0° 0'\'' 0"' ]]
    then
        echo $cmdOutputLon >> $schrijfPad
        echo $cmdOutputLat >> $schrijfPad
        continue 2
    fi

    if [ $huidigeIndexStart -gt $loopCount ] && [ $loopCount -gt 0 ]
    then
        echo $cmdOutputLon >> $schrijfPad
        echo $cmdOutputLat >> $schrijfPad
        continue 2
    fi

    huidigeIndexStart=$(($huidigeIndexStart + 1))
done

echo $cmdOutputLon >> $schrijfPad
echo $cmdOutputLat >> $schrijfPad
done


now=$(date +"%m_%d_%Y_%H:%M:%S");
echo $now
echo "Einde LastGPS_allvehicules.sh "$now >> /home/mxtbp/raid5/logs/rsync/Rsync_log.txt ;

有人可以帮忙吗?

相关内容