getopt解析命令行参数一例:汇集多个服务器的日志

 

     高效工作的一个诀窍就是尽可能自动化, 简便化。 比如, 公司里, 要搜索多个集群下的应用日志来排查问题, 需要使用 pssh:

         pssh -i -h api_hangzhou.iplist "grep  101-70795118 /path/to/info.2015-03-03.*.log"

         pssh -i -h api_hangzhou.iplist "grep  101-70795118 /path/to/info.log*"   

     

     这样有什么不方便呢?

             1.  记忆日志路径不容易, 每次要粘贴, 你知道程序员的记忆力是不佳的;

             2.  手工敲入命令太长, api_hangzhou.iplist 敲起来也比较费劲。 

             3.  抓取不同日期, 不同子系统, 不同集群下的日志不够灵活。 有时, 难以确定是哪个集群, 就必须在所有集群下进行全遍历。

     

       总之, 程序员就是要懒, 尽可能消除不方便之处, 尽可能自动化,简便化。 因此,花了一天时间, 写了一个脚本来处理这个问题(话说我SHELL 也用的不熟啊, 不过是解决具体问题啦)。 具体用法如下:

              usage: lg -k keyword -rregion -ddate

       其中, -k keyword 是内容关键字, -r, -d 都是可选的。 -r 若不指定为默认杭州集群; -d 若不指定为今天。

       最短命令可以为  lg -k keyword ,  在杭州集群今天的日志下搜索 keyword 的多个子系统的日志。

       

       当然, 该命令对于读者来说, 可能没有太多作用, 主要是做法值得借鉴。 编写类似脚本时, 可以借鉴下面的程序。 

       ln -s /home/qin.shuq/greplog /usr/local/bin/lg

       greplog 脚本:

#!/bin/bash

usage()
{
    echo 'usage: lg -k keyword -rregion -ddate '
    echo '       lg --keyword keyword --region region --date date'
    echo '       lg -h or lg --help'
    echo 'desc:  grep api-regionmaster log by keyword in specified region in specified date.'
    echo 'options:'
    echo '       -k keyword [Required]: such as vmName, diskId, requestId '
    echo '       -r region  [Optional]: [h, hangzhou, hz, q, qingdao, qd, b,beijing, bj,  '
    echo '                               f,fujian, fj, shenzhen, sz, sichuan sc, a, all] ;'
    echo '                              if not specified, default: hz'
    echo '       -d date    [Optional]: such as 2015-02-14 ; '
    echo '                              if not specified, default to today '
    echo 'eg.    lg -k i-2503rpkgr -rhz -d2015-02-10'
    echo '       lg -k i-2503rpkgr                  '
    echo '       lg -k i-2503rpkgr -rhz             '
    echo '       lg -k i-2503rpkgr      -d2015-02-10'
    echo '       lg -k i-2503rpkgr -ra  -d2015-02-10'
    echo '       lg -h or lg --help'
}

if [ $# == 0 ]
then
    usage
    exit 1
fi

TEMP=`getopt -o hk:r::d:: -l keyword:,region,date,help   -n '/home/qin.shuq/greplog' -- "$@"`
if [ $? -ne 0 ]
then
    usage
    exit 1
fi

eval set -- "${TEMP}"

keyword=""
region=""
infolog=""


while true ; do
   case "$1" in
       -k|--keyword)
           keyword="$2"
           shift 2
           ;;
       -r|--region)
           region="$2"
           shift 2 ;;
       -d|--date)
            if [[ $2 =~ ([0-9]{4}-[0-9]{2}-[0-9]{2}) ]]
            then
                infolog="info.$2.log info.$2.*.log";
            else
                infolog="info.log info.log.*"
            fi
            shift 2 ;;
       -h|--help)
            usage
            exit 0
            ;;
       --)
            shift
            break
            ;;
        ?) echo "Internal error!"
           exit 1
           ;;
    esac
done

if [[ $keyword = '' ]]
then
    echo 'Error: Required parameter -k keyword not specified'
    usage
    exit 1
fi

if [[ $infolog = '' ]]
then
    infolog="info.log info.log.*"
fi

case $region in
    h|hz|HZ|Hz|hZ|hangzhou)  region="hangzhou" ;;
    q|qd|QD|Qd|qD|qingdao)   region="qingdao" ;;
    b|bj|BJ|Bj|bJ|beijing)   region="beijing" ;;
    f|fj|FJ|Fj|fJ|fujian)    region="fujian" ;;
      sz|SZ|Sz|sZ|shenzhen)  region="shenzhen" ;;
      sc|SC|Sc|sC|sichuan)   region="sichuan" ;;
    a|all)                   region="hangzhou qingdao beijing fujian shenzhen sichuan" ;;
        *)                   region="hangzhou" ;;
esac

echo "keyword=$keyword, region=[$region], infolog=$infolog"

iplistPath=/home/admin
regionmasterLogPath=/home/admin/xxx
apiLogPath=/home/admin/xxx

for reg in $region ; do
    api_iplistFile="api_${reg}.iplist"
    for log in $infolog ; do
        echo "pssh -i -h $iplistPath/$api_iplistFile \"grep $keyword $apiLogPath/$log\""
        pssh -i -h $iplistPath/$api_iplistFile "grep  $keyword $apiLogPath/$log" | grep -v "FAILURE"
    done
done

for reg in $region ; do
    regionmaster_iplistFile=regionmaster_${reg}.iplist
    for log in $infolog ; do
        echo "pssh -i -h $iplistPath/$regionmaster_iplistFile \"grep  $keyword $regionmasterLogPath/$log\""
        pssh -i -h  $iplistPath/$regionmaster_iplistFile "grep  $keyword $regionmasterLogPath/$log" | grep -v "FAILURE"
    done
done

     

posted @ 2015-03-16 21:43  琴水玉  阅读(429)  评论(0编辑  收藏  举报