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 [ $# == ]
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解析命令行参数一例:汇集多个服务器的日志的更多相关文章
- Python3+getopt解析命令行参数
一.说明 在学C语言的时候就知道可以通过argc获取命令行参数个数,可以通过argv获取具体参数.但自己写的程序获取到的参数一是没有键值形式二是写的参数不能乱序,和系统命令不太一样. 再往后点知道有g ...
- 【转】getopt分析命令行参数
(一) 在Linux中,用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题,例如: ./a.out -a1234 -b432 -c -d 程序会根据读取的参数执行相应的操作,在C语言中,这个 ...
- python解析命令行参数
常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...
- C语言中使用库函数解析命令行参数
在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...
- Windows下解析命令行参数
linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...
- boost之program_options库,解析命令行参数、读取配置文件
一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...
- optparse模块解析命令行参数的说明及优化
一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...
- linux 中解析命令行参数(getopt_long用法)
linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...
- Shell 参数(2) --解析命令行参数工具:getopts/getopt
getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...
随机推荐
- Watering Grass
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 题意: 给定一条草坪,草坪上有n个喷水装置.草坪长 ...
- jquery过滤器之:contains()、.filter()
:contains 选择器选取包含指定字符串的元素. 该字符串可以是直接包含在元素中的文本,或者被包含于子元素中. 经常与其他元素/选择器一起使用,来选择指定的组中包含指定文本的元素,如: $(&qu ...
- [zt]摄像机标定(Camera calibration)笔记
http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...
- java实现单链表反转
一.简介 经查阅,主要有两种方法实现链表反转,递归反转法和遍历反转法: 递归: 在反转当前结点之前先反转其后边的结点,即.从尾结点开始逆向反转各个节点的指针域指向: 遍历:从前往后反转各个结点的指针域 ...
- 禁止浏览器直接访问php文件
框架中很多php文件并不是用来如果熟悉框架的路径就能直接访问这个文件,虽然访问到了也不能看到什么(他看到的是编译过后的html文件),但还是觉的很不安全. 可以通过下面这种方法拒绝他人的从浏览器中的访 ...
- hdu Tempter of the Bone
很典型的dfs题,但是涉及到很多的剪枝 . 奇偶剪枝: 是数据结构的搜索中,剪枝的一种特殊小技巧. 现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点, s | ...
- 【HDU 3401 Trade】 单调队列优化dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 题目大意:现在要你去炒股,给你每天的开盘价值,每股买入价值为ap,卖出价值为bp,每天最多买as ...
- php有效的过滤html标签,js代码,css样式标签
过滤html标签�php中太简单了,我们可以直接使用strip_tags函数来实现了,下面给各位整理了一些关于 strip_tags函数的例子. php过滤html的函数:strip_tags(str ...
- 利用.htaccess实现伪静态方法
首先配置服务器启动重写模块打开 Apache 的配置文件 httpd.conf .将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉.保存后重启 ...
- NFS服务器搭建
1. 安装nfs-kernel-server,然后编辑/etc/exports. /sambadata/nfsserver 10.0.0.0/255.255.255.0(fsid=0,all_s ...