工作中需要写一个shell用来查询符合条件的上下若干条记录!
来源:互联网 发布:简谱编辑器 mac 编辑:程序博客网 时间:2024/05/05 19:52
项目需要做一个shell程序,用来查找指定日志文件中某段字符串str,再根据该字符串str所在的行,找到对应的某个字段str1($*)再以此str1找出str上下若干包含str1的行,主要内容用awk实现,还用到了getopts进行参数的判断:
#!/bin/bash# File: Fmsg.sh# Author: xiaoleyu@gmail.com# Update: 2008-07-30while getopts "m:k:l:f:" flagdo 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" ;; esacdoneecho Searching MSG is $MSGecho BufferLenght is $BUFLecho FileName is $FileNameif [ -n "$BUFL" ] #说明:如果BUFL( -l 参数)为空 则BUFLEN=3 表示显示与str相关的上下3行的记录thenBUFLEN=$BUFLelseBUFLEN="3" # 需要引号fiif [ -n "$FileName" ]thenFile=$FileNameelseFile=""fiif [ -n "$KEY" ]thenKEY1=$KEYgrep $KEY1$File > filter.out #如果File 为空则可通过管道输入File="filter.out"elseFile=$FileNamefiREQFILE=$MSGawk -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 dddddddddddhhhh a bbbbbbbb ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadasafsd a 22222222 ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsfaaaa a 22222222 asdasdsdsdd ddddddddd eeee fffffffff dddddddddddhhhh a 22222222 ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadasafsd a 22222222 this_is_msg sadsfsafa dfas dfasdfasd safsdfsafsfaaaa a 22222222 cccccccccdd ddddddddd eeee fffffffff dddddddddddhhhh a 22222222 ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadasafsd a 22222222 ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsfaaaa a bbbbbbbb cccccccccdd ddddddddd eeee fffffffff dddddddddddhhhh a bbbbbbbb ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadasafsd a asfasdfs ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsfaaaa a bbbbbbbb cccccccccdd ddddddddd eeee fffffffff dddddddddddhhhh a bbbbbbbb ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadasafsd 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 safsdfsafsfaaaa a 22222222 asdasdsdsdd ddddddddd eeee fffffffff dddddddddddhhhh a 22222222 ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadasafsd a 22222222 this_is_msg sadsfsafa dfas dfasdfasd safsdfsafsfaaaa a 22222222 cccccccccdd ddddddddd eeee fffffffff dddddddddddhhhh a 22222222 ddddddddddd eeeeeeeee aaaa ccccccccc lkkkkksadasafsd a 22222222 ddsfsafdsdd sadsfsafa dfas dfasdfasd safsdfsafsf
- 工作中需要写一个shell用来查询符合条件的上下若干条记录!
- MySQL查询符合某个条件的前若干条语句或者后若干条语句
- Sql 查询一个表中符合条件的且某一项为最大的记录
- Yii: 查询符合条件的记录个数
- 单据管理窗口,上下两个datagridview查询时没有符合条件的记录时,绑定数据源的方法
- 在oracle数据库中需要查询出前8条记录的sql语句怎么写
- DataTable中查询符合条件的数据
- mysql查询符合某种条件的语句是第几条
- jdbc获取符合查询条件的记录数据---ResultSet
- 【SQL】按字段分组查询符合条件记录的方法
- 查询数据库中指定字段符合条件的记录数
- tp中一个字段符合多个条件的查询,where like or
- Jxls导出excel的若干方式总结(六)-- 分sheet导出查询记录,每条记录一个sheet
- Jxls导出excel的若干方式总结(六)-- 分sheet导出查询记录,每条记录一个sheet
- 如何提取access数据库中符合特定条件的记录
- 写一个函数,用来把一个字符串用指定的字符作为分隔符分割成若干个子串输出 | 写一个函数,用来返回一个字符串中重复出现的最长字串的长度及其开始地址
- thinkPHP后台查询mySQL中数据时,当没有符合条件的记录count结果集的值为1
- 利用cursor及fetch将一个表中符合条件的记录拷贝到另一个表中
- GridView刪除確認
- C# 模仿QQ、MSN消息提示系列 四、bug修改 效果优化
- 很黄很暴力的幽默回复
- Windows下用Code::Blocks+MingGW进行OpenGL2.0开发(使用GLEW库)的准备工作
- ASP.NET 2.0程序开发详解 -------15.3 ASP.NET AJAX Extension简介
- 工作中需要写一个shell用来查询符合条件的上下若干条记录!
- 工作或学习中经常遇到的五种阻塞情况
- JNDI
- 完成端口使用总结
- 冒泡排序和改进的冒泡排序的性能差距
- T-sql DateTime数据类型的格式转换
- JavaScript 表单验证(三十五)
- nero8 刻录 avi文件
- 将DataSet里所有数据导入Excel