Pages

2011年7月24日 星期日

新版本支持道具搜索

注意了使用此腳本最好先把GMSV SAAC 等的服務端程序都徹底關閉,否則後果自負
此腳本適合檢查目前所有服務端的人物數據
Copy code

    #!/bin/sh
    #本腳本用於檢查石器服務端人物數據
    help()
    {
    echo "腳本參數如下:"
    echo "-h  幫助?"
    echo "-d  數據字段例如:memberpoint(會員點字段)"
    echo "-s  文件夾路徑"
    echo "-c  運算符號 = < >"
    echo "-l  邏輯運算符 & | !"
    echo "-e  2次運算符號 = < >"
    echo "-nc  行數運算符號 = < >"
    echo "-num 判斷結果的數量 =\>\<\數值"
    echo "-t  文件種類如果想搜索所有文件請設置* 只單獨搜索某一文件可以.char .item .pet都可以"
    echo "-n  內容"
    echo "-en  內容2"
    echo "例子:./finddata -d memberpoint -c '>' -n 100"
    echo "搜索memberpoint>100的玩家數據並顯示文件路徑"
    }
    strp=./
    while [ -n "$1" ]; do
    case $1 in
    -h) help;shift 1;;
    -s)    strp=$2;shift 2;;
    -d) jzdata=$2;shift 2;;
    -c)    jzc=$2;shift 2;;
    -l) jzl=$2;shift 2;;
    -e) jze=$2;shift 2;;
    -nc)jznc=$2;shift 2;;
    -num)num=$2;shift 2;;
    -t)    jzt=$2;shift 2;;
    -n) jznum=$2;shift 2;;
    -en)jzenum=$2;shift 2;;
    -*) echo "錯誤的參數 -h尋求幫助";exit 1;;
    *) break;;
    esac
    done
    case $jzc in
    '=') numif=1;;
    '<') numif=2;;
    '>') numif=3;;
    *) numif=4;;
    esac

    case $jzl in
    '&') ifstr=並且;;
    '|') ifstr=或者;;
    '!') ifstr=不等於;;
    esac

    numif1=`expr $numif ">" 0`
    if [ "$numif1" = "1" ]; then
        numif1=`expr $numif "<" 4`
        if [ "$numif1" = "1" ]; then
            echo "開始搜查 $strp 目錄下"
            if [ -n "$ifstr" ]; then
                echo "$jzdata $jzc $jznum $ifstr $jzdata $jze $jzenum 的人物數據內容"
            else
                echo "$jzdata $jzc $jznum 的人物數據內容"
            fi
            jzcnum=0
            charpath=`find $strp -name "*${jzt}"`
            for charpath1 in ${charpath}
            do
                  
                    num1=0
                    num2=0
                    chardata=`grep "${jzdata}" $charpath1 | \
                        sed -e "s/${jzdata}=/\n/g" | cut -b 1-20 | \
                        sed -e "s/|/,/g" -e 's/\\\n/,/g' -e 's/\\\z/,/g' | \
                        awk -F, '{print $1}'`
                    if [ -n "$chardata" ]; then
                        charname=`echo "$chardata" | head -1`
                        for charnumtemp in ${chardata}
                        do
                          
                            numtemp2=`expr $numtemp2 "+" 1`
                            numtemp1=`expr $numtemp2 ">" 1`
                            charstrtemp=`echo "$charpath1" | grep '*.item'`
                            if [ -n "$charstrtemp" ]; then
                                charstrtemp=`echo "$charnumtemp"|grep "Depotitem*"`
                            fi
                            if [ -n "$charstrtemp" ]; then
                                charstrtemp=
                            else
                                if [ "$numtemp1" = "1" ]; then
                                    numif1=`expr $charnumtemp "$jzc" $jznum`
                                    if [ "$numif1" = "1" ]; then
                                        chardata1=`echo "$charnumtemp"`
                                        num1=`expr $num1 "+" 1`
                                    fi
                                    if [ -n "$jze" ]; then
                                        if [ -n "$jzl" ]; then
                                            numif2=`expr $charnumtemp "$jze" $jzenum`
                                            numif1=`expr $numif1 "$jzl" $numif2`
                                            if [ "$numif1" = "1" ]; then
                                                chardata=`echo "$charnumtemp"`
                                                num2=`expr $num2 "+" 1`
                                            fi
                                        fi
                                    fi
                                fi
                            fi
                        done
                        charnumtemp=`echo "當前人物字段數據為:"`
                        if [ -n "$num" ]; then
                            if [ -n "$jzl" ]; then
                                if [ -n "$num2" ]; then
                                    numif1=`expr $num2 "$jznc" $num`
                                fi
                            else
                                if [ -n "$num1" ]; then
                                    numif1=`expr $num1 "$jznc" $num`
                                    chardata=`echo "$chardata1"`
                                fi
                            fi
                        else
                            if [ -n "$jzl" ]; then
                                if [ -n "$num1" ]; then
                                    numif1=`expr $num1 ">=" 1`
                                fi
                            else
                                if [ -n "$num1" ]; then
                                    numif1=`expr $num1 ">=" 1`
                                    chardata=`echo "$chardata1"`
                                fi
                            fi
                        fi
                        if [ "$numif1" = "1" ]; then
                            jzcnum=`expr $jzcnum "+" 1`
                            echo "符合條件的人物數據文件:$charpath1" #>>文件名(擴展功能可以把信息輸出到文件)
                            echo "人物名:$charname 要查找的字段:${jzdata} ${charnumtemp}${chardata}" #>>文件名(擴展功能可以把信息輸出到文件)
                        fi
                    fi
            done
        numif1=`expr $jzcnum ">" 0`
        if [ "$numif1" = "1" ]; then
            echo "共搜索到:$jzcnum 條數據"
        else
            echo "沒有搜索到數據"
        fi
        fi
    fi
    exit 1


創建一個finddata的文件然後輸入上面的內容注意文件格式為unix

./finddata -d memberpoint -c '>' -n 10 -s /sa80/saac/char/
此參數啟動腳本就是查找會員點>10的人物數據,如果想查其他數據可以改一下腳本參數.
./finddata -d =id -c '>' -n 19775 -e '<' -en 19781 -l '&' -nc '>' -num 0 -t '*' -s /sa80/saac/char
此參數啟動腳本就是檢查擁有19776-19780道具的人物數據 -nc '>' -num 0 這個意思是擁有的數量>0


[ 此貼被[嚇人組]吉仔在2007-05-26 16:16重新編輯 ]


如果想單獨查某一個道具可以忽略掉2次運算的相關幾個參數
例如./finddata -d =id -c '=' -n 19778 -nc '>' -num 0 -t '*' -s /sa80/saac/char
-t是文件類型*代表所有文件也可以設置成 .item 只檢查道具倉庫 .char 只檢查人物數據

沒有留言:

張貼留言