设为首页 收藏本站
查看: 1117|回复: 0

工作中需要写一个shell用来查询符合条件的上下若干条记录

[复制链接]

尚未签到

发表于 2017-5-16 09:55:57 | 显示全部楼层 |阅读模式
项目需要做一个shell程序,用来查找指定日志文件中某段字符串str,再根据该字符串str所在的行,找到对应的某个字段str1($*)再以此str1找出str上下若干包含str1的行,主要内容用awk实现,还用到了getopts进行参数的判断:

#!/bin/bash
# File: Fmsg.sh
# Author: xiaoleyu@gmail.com
# Update: 2008-07-30
while getopts  "m:k:l:f:" flag
do
    case $flag in
        m) MSG=$OPTARG #各个参数后面的值都保存在OPTARG 这个默认参数里面
        ;;
        l) BUFL=$OPTARG
        ;;
        k) KEY=$OPTARG
        ;;
        f) FileName=$OPTARG
        ;;
        ?) echo "-f FileName -m SearchMsg -k Key -l BufferLenght "
         ;;
        *) echo "something wrong"
        ;;
    esac
done

echo Searching MSG is $MSG
echo BufferLenght is $BUFL
echo FileName is $FileName

if [ -n "$BUFL" ] #说明:如果BUFL( -l 参数)为空 则BUFLEN=3 表示显示与str相关的上下3行的记录
then
BUFLEN=$BUFL
else
BUFLEN="3" # 需要引号
fi

if [ -n "$FileName" ]
then
File=$FileName
else
File=""
fi


if [ -n "$KEY" ]
then
KEY1=$KEY
grep $KEY1$File > filter.out #如果File 为空则可通过管道输入
File="filter.out"
else
File=$FileName
fi

REQFILE=$MSG
awk -F " " ' #-F " "表示以空格作为不同参数($*)的分隔符
BEGIN {
m='$BUFLEN';n='$BUFLEN';i=1;nr_up=0;nr_down=0;
}
{
for(i=1;i<=m;i++)
{
up[$3,i]=up[$3,i+1];#二维数组表示特点[,]
}

{
if(flag>0)
{
if( temp2==$3)
print $0; flag --;
}
}
up[$3,m+1]=$0;

}

/'$REQFILE'/{ # { 需要接在/后面,否则可能出现判断失效
temp2=$3;
if(nf_up==0)
nr_up=NR;
else {
if(nr_down!=0) nr_up=nr_down; nr_down=NR;
}

if(nr_down!=0 && nr_up!=0 && nr_down-nr_up<=m+n)
{
for(i=1;i<=m+n-(nr_down-nr_up-1);i++)
{
delete up[$3,i];
}
}
for(j=1;j<=m;j++)
{
print up[$3,j]
}
print $0;
flag=n;
next;
}' $File#调用方法1:cat fileName | sh Fmsg.sh -m str -l bufLen
#调用方法2:sh Fmsg.sh -m str -l bufLen -f fileName -k 关键字说明:
文件名 "fileName"
文件内容如下:

aaaa a bbbbbbbb cccccccccdd ddddddddd eeee fffffffff ddddddddddd
hhhh a bbbbbbbb ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadas
afsd a 22222222 ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsf
aaaa a 22222222 asdasdsdsdd ddddddddd eeee fffffffff ddddddddddd
hhhh a 22222222 ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadas
afsd a 22222222 this_is_msg sadsfsafa dfas dfasdfasd safsdfsafsf
aaaa a 22222222 cccccccccdd ddddddddd eeee fffffffff ddddddddddd
hhhh a 22222222 ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadas
afsd a 22222222 ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsf
aaaa a bbbbbbbb cccccccccdd ddddddddd eeee fffffffff ddddddddddd
hhhh a bbbbbbbb ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadas
afsd a asfasdfs ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsf
aaaa a bbbbbbbb cccccccccdd ddddddddd eeee fffffffff ddddddddddd
hhhh a bbbbbbbb ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadas
afsd a asfasdfs ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsf

我们输入要找的msg是:‘this_is_msg’
通过这个msg 找到$2="22222222"
然后我们找出该行前后包括"22222222"的若干行(值为BUFLEN)
命令为:
sh Fmsg.sh -m this_is_msg -l 3 -f fileName
打印结果为:
afsd a 22222222 ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsf
aaaa a 22222222 asdasdsdsdd ddddddddd eeee fffffffff ddddddddddd
hhhh a 22222222 ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadas
afsd a 22222222 this_is_msg sadsfsafa dfas dfasdfasd safsdfsafsf
aaaa a 22222222 cccccccccdd ddddddddd eeee fffffffff ddddddddddd
hhhh a 22222222 ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadas
afsd a 22222222 ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsf



可以用 grep abcd info.log -C 10 来实现

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-377986-1-1.html 上篇帖子: shell 脚本,在调试时,FOR循环那行代码,总是出现错误syntax error near unexpected token do 下篇帖子: vbScript中WScript.Shell对象的run和exec使用心得
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表