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 ...
随机推荐
- 用脚本来简化iOS美术同学的工作
用脚本来简化iOS美术同学的工作 问题 我们知道,在 iOS 开发中,为了使我们的 app 能够同时支持 iPhone 的 Retina 屏幕和普通屏幕,美术同学需要对 UI 设计稿中的每个元素进行 ...
- view保存为图片
一.概述 简书.微博.便签等都有将文章保存为图片的功能.笔者臆测,此功能的实现原理如下. 二.实现 2.1将View保存成Bitmap对象 方法1(亲测有效) private Bitmap makin ...
- [LintCode] Reverse Pairs 翻转对
For an array A, if i < j, and A [i] > A [j], called (A [i], A [j]) is a reverse pair.return to ...
- android获取系统通讯录
package com.example.administrator.yunphone.View; import android.app.Fragment; import android.databas ...
- CentOS默认开放的本地端口范围
系统本地开放端口的范围:(默认30000多到60000多) [root@linux2 ~]# vim /etc/sysctl.conf net.ipv4.ip_local_port_range = 1 ...
- C#,.Net自动生成大写字母编码
public static string GetChineseSpell(string strText) { int len = strText.Length; ...
- jquery ui dialog去掉右上角的叉号
var dialog = $("#id").dialog({ resizable:false, height:, width:, zIndex:, modal:true, open ...
- MUI - 侧滑菜单
各大APP必备的侧滑菜单栏,支持手势滑动.包含QQ式.美团式等 结构模板 这里是示例Html, 必须使用Mui框架才能使用. 主容器 <div class="mui-off-canva ...
- XPath提取xml文档数据
package itcast.dom4j; import java.io.File; import org.dom4j.Document; import org.dom4j.DocumentExcep ...
- java环境搭建系列:JDK环境变量详细配置
学习java语言,编写java程序,运行java程序,都离不开Java环境的支持,最重要的就是安装JDK,JDK给我提供了java程序的开发环境和运行环境.为了让java程序放在电脑的任意位置都可以执 ...