踩到的坑
-
最开始写这个的时候"[“后面没有加空格,惨,应该是bash词法分析用空格作为分隔符导致的。没有空格会导致”["和后面的构成一个token。好奇bash里是不是有这种token存在。
if [ "$p_count" == "$p_max" ]; then let p_count=0 wait fi -
这个sed也很关键,linux下有色字符自带颜色编码,难怪
match($0, /server":[0-9]+/);一开始总是没生效。后来发现,嗯,颜色编码在作怪。sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" -
这段写的这么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

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

被折叠的 条评论
为什么被折叠?



