高效工作的一个诀窍就是尽可能自动化, 简便化。 比如, 公司里, 要搜索多个集群下的应用日志来排查问题, 需要使用 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 [ $# == ]
then
usage
exit
fi TEMP=`getopt -o hk:r::d:: -l keyword:,region,date,help -n '/home/qin.shuq/greplog' -- "$@"`
if [ $? -ne ]
then
usage
exit
fi eval set -- "${TEMP}" keyword=""
region=""
infolog="" while true ; do
case "$1" in
-k|--keyword)
keyword="$2"
shift
;;
-r|--region)
region="$2"
shift ;;
-d|--date)
if [[ $ =~ ([-]{}-[-]{}-[-]{}) ]]
then
infolog="info.$2.log info.$2.*.log";
else
infolog="info.log info.log.*"
fi
shift ;;
-h|--help)
usage
exit
;;
--)
shift
break
;;
?) echo "Internal error!"
exit
;;
esac
done if [[ $keyword = '' ]]
then
echo 'Error: Required parameter -k keyword not specified'
usage
exit
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

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

  1. Python3+getopt解析命令行参数

    一.说明 在学C语言的时候就知道可以通过argc获取命令行参数个数,可以通过argv获取具体参数.但自己写的程序获取到的参数一是没有键值形式二是写的参数不能乱序,和系统命令不太一样. 再往后点知道有g ...

  2. 【转】getopt分析命令行参数

    (一) 在Linux中,用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题,例如: ./a.out -a1234 -b432 -c -d 程序会根据读取的参数执行相应的操作,在C语言中,这个 ...

  3. python解析命令行参数

    常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...

  4. C语言中使用库函数解析命令行参数

    在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...

  5. Windows下解析命令行参数

    linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...

  6. boost之program_options库,解析命令行参数、读取配置文件

    一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...

  7. optparse模块解析命令行参数的说明及优化

    一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...

  8. linux 中解析命令行参数(getopt_long用法)

    linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...

  9. Shell 参数(2) --解析命令行参数工具:getopts/getopt

    getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...

随机推荐

  1. java-两个大数相加

    题目要求:用字符串模拟两个大数相加. 一.使用BigInteger类.BigDecimal类 public static void main(String[] args) { String a=&qu ...

  2. sublime text 3 package control

    使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码: import urllib.request,os; pf = 'Package Control. ...

  3. thinkphp类的调用

    1.在controller下新建一个类,类的名称必须按照tp的规范来写. 2.在需要调用的类中,只需new一下被调用的类名. $t=new DataController(); $t->m();

  4. spring security 管理会话 多个用户不可以使用同一个账号登录系统

    多个用户不能使用同一个账号同时登陆系统. 1. 添加监听器 在web.xml中添加一个监听器,这个监听器会在session创建和销毁的时候通知Spring Security. <listener ...

  5. Varnish安装使用(初学)

    本人对varnish也是新手,这里记录一下安装步骤! 环境:centos6.6 varnish安装包下载:wget https://repo.varnish-cache.org/source/varn ...

  6. matplotlib 安装与使用

    1.在ubuntu下输入 sudo apt-get install python-matplotlib 安装matplotlib 2.简单代码使用

  7. 详解NTFS文件系统

    一.分析NTFS文件系统的结构 当用户将硬盘的一个分区格式化为NTFS分区时,就建立了一个NTFS文件系统.NTFS文件系统同FAT32文件系统一样,也是用“簇”为存储单位,一个文件总是占用一个或多个 ...

  8. YAML 模板文件语法

    YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其 ...

  9. Android WebApp开发使用Genymotion连接Fiddler2/Charles代理调试

    1.       目的 在模拟器的浏览器或app hybrid开发中遇到chrome调试代码为线上代码或者混淆代码时,可以利用fiddler/charles为genymotion配置代理, 可以方便的 ...

  10. 数据库表结构对比同步mysqldiff

    开发服务器的数据库表结构进行了修改,或者修改过多,为了与线上的数据库结构同步,可以使用mysqldiff工具对线上数据库打补丁. mysqldiff Windows下载地址:http://dev.my ...