使用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‘ -- "[email protected]"`
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
时间: 2024-10-05 04:40:45

使用getopt解析命令行一例的相关文章

Python3+getopt解析命令行参数

一.说明 在学C语言的时候就知道可以通过argc获取命令行参数个数,可以通过argv获取具体参数.但自己写的程序获取到的参数一是没有键值形式二是写的参数不能乱序,和系统命令不太一样. 再往后点知道有getopt这个东西,但印象中尝试理解其用法很多次都没什么结果:最近又越来多写程序,再次感觉很有必要掌握. 这里以Python3为例演示getopt,python感觉就是C的封装,C的getopt应该也类似. 二.程序代码 此程序中设置-h/-n/-p三个选项,-h不带值-n和-p带值:三个参数设置等

Linux getopt/getopts解析命令行参数教程

一.说明 shell中获取参数可以直接使用$1.$2等形式来获取,但这种方式有明显的限制:每个参数的位置是固定的.比如如果在设计上$1是ip地址$2是端口,那在执行时就必须第一个参数是ip第二个参数是端口而不能反过来. shell提供了getopt和getopts来解析参数,getopt比getopts功能强一些getopts比getopt简单一些:总体而言getopt和getopts都差强人意. 二.使用getopt解析参数 getopt比getopts强一些复杂一些:能在命令行中单独使用.支

linux使用getopt解析参数

getopt是linux下解析命令行参数的api.以linux内核代码的一个例子来说明: static void cmdline(int argc, char *argv[]){    int opt;    progname = basename(argv[0]); while ((opt = getopt(argc, argv, "+lci:m:")) != -1) {        switch (opt) {        case 'l':            if (mo

【转】getopt分析命令行参数

(一) 在Linux中,用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题,例如: ./a.out -a1234 -b432 -c -d 程序会根据读取的参数执行相应的操作,在C语言中,这个功能一般是靠getopt()这个函数,结合switch语句来完成的,首先来看下面的代码: #include <stdio.h>#include <unistd.h> int main(int argc,char *argv[]){  int ch;  opterr=0;    whil

python 解析命令行

原文 http://python.jobbole.com/87014 python解析命令行 2016/12/13 · 基础知识 · 命令行 分享到:0 原文出处: 顾慎为 getopt:和C中的getopt()等价.optparse:2.7后已不推荐使用.argparse:基于optparse的新库.docopt:根据文档描述,自动生成.另一份参考文档:docopt. 更详细的内容可参考上述文档. getopt 若对C的getopt()函数不熟悉,或者倾向于使用较少的代码,或者需要对帮助信息和

shell解析命令行的过程以及eval命令

本文说明的是一条linux命令在执行时大致要经过哪些过程?以及这些过程的大致顺序. 1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e "some files:" ~/i* "\nThe date:$(date +%F)\n$name's age is $((a+4))" >/tmp/a.log 假设在执行该命令前,已赋值变量"name=longshuai"和"a=

shell如何解析命令行以及eval命令

1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e "some files:" ~/i* "\nThe date:$(date +%F)\n$name's age is $((a+4))" >/tmp/a.log 假设在执行该命令前,已赋值变量"name=longshuai"和"a=24",于是重定向到/tmp/a.log中的结果为: some files

getopt_long函数解析命令行参数

转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用getopt来实现的. 在Linux下使用getopt写程序是一种比较cool的事情,下面来简单的介绍一下getopt的使用. === getopt使用 === 在讨论参数处理之前,我们先明确两个概念:选项.选项参数gcc -g -o test test.c我们经常使用上面的命令来编译程序,这里g和

python argparse模块解析命令行选项简单使用

argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argparse.ArgumentParser(prog="myprogram ",description="a test of argparse") parser.add_argument("-a",type=int,dest="start"