高效工作的一个诀窍就是尽可能自动化, 简便化。 比如, 公司里, 要搜索多个集群下的应用日志来排查问题, 需要使用 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. IO流,File类的测试........课堂加总结

    package liu0926; import java.io.File; import java.io.IOException; public class Text01 { public stati ...

  2. AJAX回调(调用后台方法返回数据)

    记得先要导入jquery.js. 格式一 $.ajax({"Key1":"value1","key2":"value2" ...

  3. 复选框,:checked

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. sign in和sign up区别

    如果是网站的话sign up是注册,sign in是登录的意思,另外,sign out退出

  5. Learn ZYNQ Programming(1)

    GPIO LED AND KEY: part1:gpio leds and gpio btns combination. (include 1~4) part2:use gpio btns inter ...

  6. 当table中的td内容过多,显示不完全,用省略号表示。

    .format{ min-width:100px; max-width:200px; overflow:hidden; white-space:nowrap; text-overflow:ellips ...

  7. vue 倒计时

    简单粗暴 export default { data () { return { timer: 30, //默认倒数30秒 stop : false, //默认是停止的,但界面加载之后会变成false ...

  8. php Use of undefined constant的问题解决方式

    在每个文件头上加 error_reporting(0); 或者 搜索php.ini: error_reporting = E_ALL 改为: error_reporting = E_ALL & ...

  9. C# Color

    一.创建一个Color对象: Color c=Color.FromKnownColor(KnownColor.colorname); 二.四种同样颜色的不同方式: Color c1=Color.Fro ...

  10. java环境搭建系列:JDK从下载安装到简单使用

    最近,问的比较多的问题居然是jdk的问题,对于新手来说这确实有点难度,毕竟一个人经常上网浏览新闻和观看视频的人,一下子开始一门编程语言的环境搭建.这中间需要一个慢慢适应的过程.回想当初我在这个阶段也很 ...