`
xly1981
  • 浏览: 143384 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多
项目需要做一个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 来实现
分享到:
评论

相关推荐

    Linux 下 Shell的工作原理

    shell是用户和Linux操作系统之间的接口。... shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。

    shell脚本读写sd卡的案例

    shell脚本一个读写sd卡的案例,这个例子可以帮助出学者进步了解shell编程

    linux shell 条件测试

    linux shell 条件测试

    Linux shell命令详解

    简单的说shell程序就是一个包含若干行shell或者linux命令的文件,象编写高级语言的程序一样,编写一个shell程序需要一个文本编辑器.如Ⅵ等.在文本编辑环境下,依据shell的语法规则,输入一些shell/linux命令行,形成...

    01_shell编程.docx

    用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行...

    Linux运维工作中Shell

    Linux运维工作中Shell最常用的技巧

    SHELL脚本练习 写一个脚本,利用循环计算10的阶乘

    SHELL脚本练习 写一个脚本,利用循环计算10的阶乘

    Linux Shell脚本编程

    实验任务一:编写一个Shell过程完成如下功能(必须在脚本中使用函数):1、程序接受3个参数:$1、$2和$3,合并两个$1、$2文件为$3,并显示,三个文件均为文本文件。2、如果缺少$3,那么先报告缺少$3,然后将合并后的...

    Shell脚本中获取进程ID的方法

    提问: 我想要知道运行中脚本子shell的进程id。我该如何在shell脚本中得到PID。 当我在执行shell脚本时,它会启动一个叫子shell的进程...在bash中,子shell进程的PID存储在一个特殊的变量‘$$’中。这个变量只读,你不可

    HBase shell的基本用法

    HBase shell的基本用法

    《操作系统》 编程项目1:开发一个shell程序 源码

    《操作系统》 编程项目1:开发一个shell程序 源码 ubuntu下测试

    250个shell脚本

    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来...

    Linux shell 脚本 markdown文本编辑

    有关几个shell脚本的编写,如:编写一个shell脚本程序,它带一个命令行参数,这个参数是一个文件。如果这个文件是一个普通文件,则打印文件所有者的名字和最后的修改日期...加入了自己的注释理解

    shell后门查询工具

    之前学习shell是使用的dos命令行查询,这个工具提供了可视化界面操作,用起来也很方便

    shell 编程指南pdf

    初学shell 入门好书!!!! 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 ...

    shell写的2048小游戏

    shell写的2048小游戏 支持多平台shell写的2048小游戏shell写的2048小游戏

    C语言写的简单Shell程序

    操作系统课上做出的简单的shell程序,能够实现除管道外大部分功能,包括JOBS和FG.

    LINUX实现一个简单的SHELL

    LINUX下实现一个简单的SHELL

    LINUX/UNIX Shell编程大作业

    这样做的一个优点就是,如果以后你需要重新命名记录或者需要在不同的记录文件中使用你的脚本的话,你只需要修改以上一个语句而不须在所有有关的记录文件里逐一修改语句。如下定义另外两个变量:  add_file=add  ...

    实验一shell实验报告

    3、使用vi编辑器编写一段Shell程序,取名为mycal,实现与Linux中cal命令类似的功能,当输入: $mycal [月份名] 年时,屏幕输出指定的年月的月历。例如: $mycal October 2009 屏幕输出2009年10月的月历。 注:参数...

Global site tag (gtag.js) - Google Analytics