您的位置:首页 > 运维架构

使用getopt解析命令行一例

2015-03-16 21:43 225 查看
高效工作的一个诀窍就是尽可能自动化, 简便化。 比如, 公司里, 要搜索多个集群下的应用日志来排查问题, 需要使用 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: