2013-07-19 2 views
0

Я создал сценарий Bash для мониторинга некоторых файлов журналов сервера для определенных данных, и мой метод, вероятно, не самый эффективный.BASH лучший способ контролировать файлы

Один раздел специально меня испугает, так что я должен написать новую строку для отслеживаемого журнала, чтобы эта же строка не читалась постоянно.

Отзыв был бы рад!

#!/bin/bash 

serverlog=/home/skay/NewWorld/server.log 
onlinefile=/home/skay/website/log/online.log 
offlinefile=/home/skay/website/log/offline.log 
index=0 

# Creating the file 
if [ ! -f "$onlinefile" ]; then 
    touch $onlinefile 
    echo "Name     Date   Time" >> "$onlinefile" 
fi 
if [ ! -f "$offlinefile" ]; then 
    touch $offlinefile 
    echo "Name     Date   Time" >> "$offlinefile" 
fi 

# Functions 
function readfile { 

# Login Variables 
loginplayer=`tail -1 $serverlog | grep "[INFO]" | grep "joined the game" | awk '{print $4}'` 
logintime=`tail -1 $serverlog | grep "[INFO]" | grep "joined the game" | awk '{print $2}'` 
logindate=`tail -1 $serverlog | grep "[INFO]" | grep "joined the game" | awk '{print $1}'` 

# Logout Variables 
logoutplayer=`tail -1 $serverlog | grep "[INFO]" | grep "left the game" | awk '{print $4}'` 
logouttime=`tail -1 $serverlog | grep "[INFO]" | grep "left the game" | awk '{print $2}'` 
logoutdate=`tail -1 $serverlog | grep "[INFO]" | grep "left the game" | awk '{print $1}'` 

# Check for Player Login 
    if [ ! -z "$loginplayer" ]; then 
     echo "$loginplayer   $logindate $logintime" >> "$onlinefile" 
     echo "Player $loginplayer login detected" >> "$serverlog" 
     line=`grep -rne "$loginplayer" $offlinefile | cut -d':' -f1` 
     if [ "$line" > 1 ]; then 
      sed -i "$line"d $offlinefile 
      unset loginplayer 
        unset line 
     fi 
    fi 
# Check for Player Logout 
    if [ ! -z "$logoutplayer" ]; then 
     echo "$logoutplayer   $logoutdate $logouttime" >> "$offlinefile" 
     echo "Player $loginplayer logout detected" >> "$serverlog" 
     line=`grep -rne "$logoutplayer" $onlinefile | cut -d':' -f1` 
     if [ "$line" > 1 ]; then 
      sed -i "$line"d $onlinefile 
      unset logoutplayer 
      unset line 
     fi 
    fi 
} 

# Loop 
while [ $index -lt 100 ]; do 
    readfile 
done 

Спасибо!

+0

Если вы хотите, чтобы люди просмотрели ваш код, codereview.stackexchange.com - лучший форум –

ответ

0

вместо использования нескольких

tail -n 1 file 

попробовать следующую конструкцию:

tail -f file | while read line;do 
    echo "read: $line" 
done 

будет гораздо более надежным ... и не будет читать ту же линию дважды;)

примечание: используя новые процессы grep/awk/etc, вы сжигаете процессы ... это не значит, что это критически важно, но обычно процесс создания дорог ... но если новые строки встречаются редко, то это совершенно нормально

, где я хочу, чтобы получить: если вы заинтересованы, посмотрите на функцию манипулятора строки bash builting, замените $ (x/aa} $ {x // aa} и друзей ..или попробуйте использовать расширенные regexpes with grep