`
xly1981
  • 浏览: 147196 次
  • 性别: 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 查询oracle数据库中的值 并返回

    4. **脚本化查询**:在shell脚本中,可以将SQL查询写入一个外部文件(如`fix.sql`),然后在SQL*Plus中执行该文件: ```bash sqlplus -s username/password@connect_string &lt; fix.sql &gt; output.txt ``` `-s`选项...

    C语言写的简单Shell程序

    标题 "C语言写的简单Shell程序" 指的是一个用C编程语言编写的简易命令行解释器,类似于Unix/Linux环境中的Bash Shell。这个程序旨在为用户提供一个交互式的环境,可以执行基本的命令行操作,尽管它不支持复杂的管道...

    Linux 下 Shell的工作原理

    Linux中的Shell是一个至关重要的组成部分,它是用户与操作系统交互的接口,扮演着命令解释器的角色。在Linux系统中,默认的Shell通常是Bash(Bourne-Again SHell),它继承了Bourne shell的功能并增加了许多扩展特性...

    在python 中实现运行多条shell命令

    `shell=True`表示通过shell来执行命令,而`&&`则是用来连接两个命令,确保前一条命令成功后才会执行下一条命令。 - **注意**:`shell=True`可能会带来安全风险,因为它允许注入shell命令。在处理用户提供的数据时要...

    shell编程用户信息管理(模拟)课程设计说明书

    通过设计一个 shell 程序实现增加、删除、查找和显示特定用户信息的功能,达到 Linux 作为多用户、多任务的操作系统,用户管理是操作系统的重点的目的。 知识点: 1. 变量定义:在 shell 脚本中,变量可以用来存储...

    B shell与 C shell的区别

    1. 命令历史记录:C shell提供了命令历史记录的功能,用户可以通过按上下箭头键来回顾之前输入的命令,而B shell不具备这个功能。 2. 文件名补全:C shell提供了文件名补全的功能,用户可以通过按Tab键来补全文件名...

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

    在这个练习中,我们将编写一个SHELL脚本,以方便用户查询RPM相关信息。这个脚本首先提示用户选择查询依据,然后提示用户选择查询信息,最后询问是否继续查询,是则循环刚才的过程,否则退出。脚本代码如下: ```bash...

    shell脚本语言.pdf

    2. 批处理(Batch):用户事先写一个 Shell 脚本(Script),其中有很多条命令,让 Shell 一次把这些命令执行完,而不必一条一条地敲命令。 Shell 脚本语言的特点: * 是一种解释执行的语言,不需要编译 * 具有...

    无聊写了个shell脚本

    在标题“无聊写了个shell脚本”中,我们可以想象作者利用闲暇时间探索并实践了Shell脚本编写。描述中提到的“shell的loading效果”,指的是在执行命令或程序时显示动态加载的界面,这种效果可以提供用户反馈,增加...

    250个shell脚本

    Shell脚本是Linux/Unix操作系统中的强大工具,它允许用户编写一系列命令,形成自动化任务,以提高工作效率。本文档收集了250个实用的Shell脚本实例,涵盖了多个应用场景,包括系统管理、安全防护、数据库备份等核心...

    一个批量域名解析的Shell脚本例子

    标题中的“一个批量域名解析的Shell脚本例子”是指通过Shell脚本来实现对大量域名进行DNS解析的功能。在IT行业中,这种操作常用于网络监控、安全分析或数据收集等场景。下面将详细介绍这个主题。 首先,`...

    shell脚本读写sd卡的案例

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

    linux shell 条件测试

    linux shell 条件测试

    脚本shell写的,一些工作脚本集合

    标题“脚本shell写的,一些工作脚本集合”表明这是一个包含多种实用Shell脚本的资源库,可能涵盖了各种不同的工作场景。 描述中提到这些脚本是“平时积累起来的”,这暗示了这些脚本经过时间的检验,具有实用性,...

    Linux shell命令详解

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

    java调用shell向DataX传递参数,where条件,包含特殊字符

    在JSON配置文件中,where条件可能被用来构造SQL查询,如: ```json { "job": { "content": [ { "reader": { "name": "oraclereader", "parameter": { "where": "${condition}", ... } }, "writer": { ...

    Linux运维工作中Shell

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

    用C语言实现的shell

    【标题】"用C语言实现的shell" 描述了作者使用C语言编写了一个小型的shell程序,虽然它可能不包含所有内置的Unix/Linux shell命令,但已经实现了相当一部分功能。这个项目展示了如何在低级别的编程语言中构建一个...

    Shell编程中文手册.pdf

    Shell 脚本的执行方式有两种:一种是采用 bash 或 sh 加脚本的相对路径或绝对路径,另一种是采用输入脚本的绝对路径或相对路径执行脚本,需要具有可执行权限。 Shell 中的变量 Shell 中的变量有系统变量和自定义...

Global site tag (gtag.js) - Google Analytics