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 ...
随机推荐
- [LintCode] House Robber II 打家劫舍之二
After robbing those houses on that street, the thief has found himself a new place for his thievery ...
- Oracle恢复删除数据 && connect by 树形结构查询
1.一个表中根据以父子级别关系查询显示出来(如图) select t.* from department t CONNECT BY PRIOR t.depid=t.supdepid ; --这样也可以 ...
- phpwind < v6 版本命令执行漏洞
phpwind/sort.php 会定期每天处理一次帖子的浏览量.回复量.精华版排序 代码直接使用savearray将数据库查询出来的内容写入php文件,savearray出来的参数,都使用" ...
- 2016HUAS暑假集训训练2 O - Can you find it?
题目链接:http://acm.hust.edu.cn/vjudge/contest/121192#problem/O 这道题是一道典型二分搜素题,题意是给定3个数组 每个数组的数有m个 再给定l个s ...
- centos6 LVS-DR模式---分析
LVS是什么就不多说了. 先上拓扑图 1台LVS 3台Realserver 一个客户端. 环境全部模拟全在内网环境(selinux和iptables关闭) 先简略说一下安装步骤: LVS上 ...
- 网页mp3播放代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 关于Java擦除特性
package thinkingInJava; /* * 模拟擦除 */ public class SimpleHolder { private Object obj ; public void se ...
- ServletContext读取Web应用中的资源文件
package cn.itcast; import java.io.FileInputStream; import java.io.IOException; import java.io.InputS ...
- 一次与iptables有关的Openstack排错
先说下环境: 宿主机A(192.168.1.242)上运行着实例a(192.168.1.176), 宿主机B(192.168.1.56)上运行着实例b(192.168.1.50). 用户说从实例b上t ...
- 虚拟机安装Macintosh探索
想跟virtualbox安装一个mac os,在pcbeta找到网友分享的原版镜像,挂载安装,结果在安装的时候不是卡在进入界面,就是不停地安装,显然没有那么简单.virtualbox 在用户手册写着支 ...