2014-02-11 33 views
1

我正在尝试编写一个脚本来记录连接状态并作为cron作业运行。如果它获得一个IP,它会将时间记录到文件中。基于条件的bash脚本行替换

#!/bin/bash 

ip=$(wget htt://checkip.dyndns.org/ -q -O - | 
grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>') 

echo $ip 

if [ -n "$ip" ] 
then 
    echo 'connected:'$(date +"%d-%m-%Y %I:%M") >> /home/saad/offline_check 
else 
    echo 'disconnected:'$(date +"%d-%m-%Y %I:%M") >> /home/saad/offline_check 
fi 

此脚本将不断追加connected:XXXX到文件每5分钟。我希望它写入一次&,然后在发生断开连接之前不要进一步记录。当连接恢复时,它应该将当前连接时间写入新行。

这就是我想要的东西:

connected:08-02-2014 08:30  #start, all connected timestamps after initial one ignored 
disconnected:09-02-2014 08:35 #disconnection logged 
connected:09-02-2014 17:31  #when connection resumes, timestamp logged, all subsequent ignored until disconnect 
disconnected:11-02-2014 08:31 

我可以在Python做到这一点,但不是在bash。

+0

如果你做了这么多'bash',可以在'python'做到这一点,我看不出有任何理由,你为什么不该无法做到。没有? – devnull

+0

我根本不用bash工作。这个脚本是别人的。我必须学习整个结构。 – koogee

回答

1

你可以写之前检查日志文件的最后一行:

#!/bin/bash 

ip=$(wget htt://checkip.dyndns.org/ -q -O - | 
grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>') 

# get the last line from log 
line=$(tail -1 /home/saad/offline_check) 

echo $ip 

if [ -n "$ip" ]; then 
    # if last line starts with "disconnected" OR is empty then write "connected" log 
    [[ -z "$line" || "$line" == 'disconnected:'* ]] && \ 
      echo 'connected:'$(date +"%d-%m-%Y %I:%M") >> /home/saad/offline_check 
else 
    [[ "$line" == 'connected:'* ]] && echo 'disconnected:'$(date +"%d-%m-%Y %I:%M") >> /home/saad/offline_check 
fi 
+0

不客气,很高兴它解决了。 – anubhava

+1

对于后代,还编辑else语句到'[[“$ line”=='connected:'*]] && echo'disconnected:'$(date +“%d-%m-%Y%I:%M “)>>/home/saad/offline_check',以避免使用'disconnect'消息过度记录日志。 – koogee

+0

好点,编辑它。 – anubhava