linux 扫日志脚本

本文介绍了一段Bash脚本的调试经历,包括解决因缺少空格引起的语法问题及处理带颜色编码的日志输出。通过sed命令去除颜色编码,并使用awk进行日志解析,实现了从指定服务器日志中提取角色名称等信息。

踩到的坑

  1. 最开始写这个的时候"[“后面没有加空格,惨,应该是bash词法分析用空格作为分隔符导致的。没有空格会导致”["和后面的构成一个token。好奇bash里是不是有这种token存在。

    if [ "$p_count" == "$p_max" ]; then
            let p_count=0
            wait
        fi
    
  2. 这个sed也很关键,linux下有色字符自带颜色编码,难怪 match($0, /server":[0-9]+/);一开始总是没生效。后来发现,嗯,颜色编码在作怪。

    sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" 
    
  3. 这段写的这么ugly的主要原因是,机器上不支持match(s,r,array)这种格式,所以没法使用正则的group。

    awk '{
            match($0, /server":[0-9]+/);
            server=substr($0, RSTART+8, RLENGTH - 8);
            match($0, /role_name":"[^"]+/);
            role_name=substr($0, RSTART+12, RLENGTH -12);
            print server"\t"xiuwei"\t"avatar_id"\t"role_name}' >$1_$4 &
            }
    

脚本内容

#!/bin/bash
# Get the log over the past HOURS hours.
SERVER_LIST_URL="http://xxx/all_gameservers"
rm all_gameservers
wget $SERVER_LIST_URL -O all_gameservers 1>/dev/null 2>/dev/null
awk '{ if (10000 < $4 && $4 < 15000) print $4;}' all_gameservers | uniq > hostnums

# Get server role_name from logtails
LOG_DIR="hostnums"
function logtail {
    echo "process hostnum $1 start time $2 end time $3"
    ./logtailes -c .logtail.conf -f $2 -t $3 -s "LogoutRole && server\":$1" --scroll | \
    sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | \
    awk '{
        match($0, /server":[0-9]+/);
        server=substr($0, RSTART+8, RLENGTH - 8);
        match($0, /role_name":"[^"]+/);
        role_name=substr($0, RSTART+12, RLENGTH -12);
        print server"\t"xiuwei"\t"avatar_id"\t"role_name}' >$1_$4 &
}

HOURS=72
total=0
p_max=20
# Delete all files before

for line in `cat hostnums`
do
    echo "Get the log of $line from $HOURS hours ago till now"
    for hour in $(seq 1 $HOURS)
    do
        #echo "Get the log from $hour hours ago till now"
        START_TIME=`date -d $hour' hour ago' +%Y.%m.%d-%H:%M:%S`
        let end=hour-1
        END_TIME=`date -d $end' hour ago' +%Y.%m.%d-%H:%M:%S`
        #echo $START_TIME, $END_TIME
        logtail $line $START_TIME $END_TIME $hour
        let p_count=p_count+1
        if [ "$p_count" == "$p_max" ]; then
            let p_count=0
            wait
        fi
    done
    let total=total+1
    wait
    echo "Finish $total hostnums..."
done
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值