使用awk、cut、sed、if、while 等

awk、cut、sed还是很重要的

这是后来修改的,可以完成

#!/bin/bash

#conver format
FILE=mobile_dpi.rules
APPFILE=app_dic.rc.BAK_2
CONVERFILE=mobile_dpi.txt

rm -rf ${CONVERFILE}

cat ${FILE} | grep "^a" | while read -r LINE
do
PROTO_TYPE=$( echo $LINE | awk '{print $2}' )
DIR=$( echo $LINE | awk '{print $4 $5 $6}' )
STR=$(echo $LINE | awk -F '>' '{for(i=2;i<=NF;i++) printf $i}')
TMPSTR=x
VAR=1
CONTENTEXPRESS=""
PCREEXPRESS=""
MSG=""
IDSTR=""
while [ "$TMPSTR"x != ""x ]
do
TMPSTR=$(echo $STR | awk -F ';' '{i='"$VAR"'; print $i}')
if [ "$(echo $TMPSTR | grep "msg:")"x != ""x ];then
MSG=$(echo $TMPSTR | awk -F '\"' '{print $2}')
fi
if [ "$(echo $TMPSTR | grep "app:id")"x != ""x ];then
IDSTR=$(echo $LINE | cut -d '$' -f 2 | cut -d '(' -f 2 | cut -d ')' -f 1 | cut -d ':' -f 1)
ID=$(cat $APPFILE | grep $IDSTR | head -1 | awk -F ';' '{print $2}' )
fi
if [ "$(echo $TMPSTR | grep "pcre:")"x != ""x ];then
PCREEXPRESS=$(echo $TMPSTR | awk -F '\"' '{print $2}')
fi
CONTENT=""
if [ "$(echo $TMPSTR | grep "content:")"x != ""x ];then
CONTENT=$(echo $TMPSTR | awk -F '\"' '{print $2}')
if [ "$(echo $CONTENT | grep '|')"x != ""x ];then
STR1=$(echo $CONTENT | cut -d '|' -f 1)
CUTSTR=$(echo $CONTENT | cut -d '|' -f 2)
STR2=$(echo $CONTENT | cut -d '|' -f 3)

CUTSTR=$( echo $CUTSTR| awk '{for(i=1;i<=NF;i++) {printf("\\\\x%s",$i);}}' )
CONTENT="${STR1}""${CUTSTR}""${STR2}"
CONTENTEXPRESS="${CONTENTEXPRESS}""(.*)""${CONTENT}"
else
CONTENTEXPRESS="${CONTENTEXPRESS}""(.*)""${CONTENT}"
fi
fi
VAR=$(($VAR+1))
done
CONTENTEXPRESS=${CONTENTEXPRESS#\(.*\)}
EXPRESS=""
if [ "$PCREEXPRESS"x != ""x ];then
EXPRESS=$PCREEXPRESS
else
EXPRESS=$CONTENTEXPRESS
fi
if [ "$EXPRESS"x != ""x ];then
echo "PROTOCOL:${PROTO_TYPE};DIR:C->S;ID:${ID};MSG:${MSG};EXPRESS:\"${EXPRESS}\"" >> ${CONVERFILE}
fi
done

这是之前的,比较乱

#!/bin/bash

#conver format
FILE=mobile_dpi.rules
APPFILE=app_dic.rc.BAK_2
CONVERFILE=mobile_dpi.txt

rm -rf ${CONVERFILE}

cat ${FILE} | grep "^a" | while read LINE

do
PROTO_TYPE=$( echo $LINE | awk '{print $2}' )
DIR=$( echo $LINE | awk '{print $4 $5 $6}' )
MSG=$(echo $LINE | cut -d '(' -f 2 | cut -d ')' -f 1 | awk -F ';' '{print $1}' | awk -F ':' '{print $2}')
IDSTR=$(echo $LINE | cut -d '$' -f 2 | cut -d '(' -f 2 | cut -d ')' -f 1 | cut -d ':' -f 1)
ID=$(cat $APPFILE | grep $IDSTR | head -1 | awk -F ';' '{print $2}' )
EXPRESTR=$(echo $LINE | awk -F '(' '{for(i=1;i<=NF;i++) printf $i}' | awk -F ';' '{for(i=2;i<=NF-2;i++)printf $i";"}')
HEAD=$(echo $EXPRESTR | awk -F ';' '{print $1}' | awk -F '\"' '{print $1}')
if [ "$HEAD"x == "pcre:"x ]; then
EXPRESS=$(echo $EXPRESTR | awk -F ';' '{print $1}' | awk -F '\"' '{print $2}')
else
EXPRESS=$(echo $EXPRESTR | awk -F '\"' '{i=1;for(i=i*2;i<=NF;i+=2)printf $i"{?}"}')
STRTMP=$(echo "$EXPRESS" |grep '|')
if [ $? -eq 0 ];then
echo $EXPRESS
# EXPRESS=$(echo $EXPRESS| awk -F '|' '{for(i=2;i<=NF;i+=2) printf $i"{?} " }'| awk '{for(i=1;i<=NF;i++){printf("\\\\x%s",$i)}}')
fi
EXPRESS=${EXPRESS%%\{?\}}
fi
echo "PROTOCOL:${PROTO_TYPE};DIR:C->S;ID:${ID};MSG:${MSG};EXPRESS:\"${EXPRESS}\"" >> ${CONVERFILE}
done

shell 脚本,提取文件中的内容的更多相关文章

  1. Python之通配符--提取文件中的内容并输出

    前言:我的学习进度其实没有那么快的,因为现在是网络工程师实习,只有晚上一点时间和周末有空,所以周一到周天的学习进度很慢,今天之所以突然跳到通配符是因为工作需要,大体讲一下我的工作需求:网络工程师就是写 ...

  2. 利用shell脚本统计文件中出现次数最多的IP

    比如有如下文件test.txt 1  134.102.173.43 2  134.102.173.43 3  134.102.171.42 4  134.102.170.9 要统计出现次数最多的IP可 ...

  3. 三.Shell脚本提取文件名称和所在的目录

    一·简介 提取文件名称或者目录,一般都会使用到#,##,%和%%,但是他们的区别很容易记混淆了.在一下4种方式中,目标匹配字符是不在结果中. #:表示从左开始算起,并且截取第一个匹配的字符 ##:表示 ...

  4. shell 脚本替换文件中某个字符串

    1.将当前目录下包含jack串的文件中,jack字符串替换为tom sed -i "s/jack/tom/g" `grep "jack" -rl ./` 2.将 ...

  5. shell脚本替换文件中字符

    1.将当前目录下包含jack串的文件中,jack字符串替换为tom sed -i "s/jack/tom/g" `grep "jack" -rl ./` 2.将 ...

  6. 使用shell脚本往文件中加一列

    上午大学同学问了我一个脚本的问题,大概需求就是看到所有端口的开启情况,还要知道每个端口的应用程序路径,而且要和之前的数据齐平,就是再加一列数据.我腚眼一看,非常容易嘛,但由于当时忙,所以就说中午给他发 ...

  7. shell脚本获取文件中key/value的小方法

    方法有N种,awk.sad.grep.cut... 以上几种方式不写了,就写两个不太常用到的. 废话少说,直接上代码: cat a.txt aa.gif=aaaa.gif bb.gif=bbbb.gi ...

  8. linux shell 脚本获取和替换文件中特定内容

    1.从一串字符串中获取特定的信息 要求1:获取本机IP:menu.lst为系统镜象的IP配置文件,需要从中获取到本机IP信息(从文件获取信息) timeout title live find --se ...

  9. Shell 从日志文件中选择时间段内的日志输出到另一个文件

    Shell 从日志文件中选择时间段内的日志输出到另一个文件 情况是这样的,某系统的日志全部写在一个日志文件内,所以这个文件非常大,非常长,每次查阅的时候非常的不方便.所以,相关人员希望能够查询某个时间 ...

随机推荐

  1. 为毛无法创建文本文件COM1.txt

    是的,windows系统下,右键,新建文本文件,将文件名编辑为COM1.txt,确认,保存……THEN....你会发现无论如何也无法创建一个文本文件,名为COM1.txt. 猜是COM1被作为了IO设 ...

  2. excel 导入数据库 / SSIS 中 excel data source --64位excel 版本不支持-- solution

    当本地安装的excel(2013版) 是64-bit时:出现的以下两种错误 解决: 1. excel 导入数据库 , 如果文件是2007则会出现:“The 'Microsoft.ACE.OLEDB.1 ...

  3. C#调试心经(1)(转)

    我们在做程序开发时,难免会遇到错误异常.如何快速地找到出错的地方.分析错误的原因以及找到解决问题的方案,是许多初级程序员困扰的问题,这也正是经验的宝贵之处.下面我将简单介绍在Visual Studio ...

  4. 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】

    RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_se ...

  5. [Maven]Maven非常详细完整的教程

    请参考:http://blog.csdn.net/u012152619/article/category/6239920 第四部分已看完 另外也可参看简书:http://www.jianshu.com ...

  6. jquery文本框内容改变事件

    /** * 内容改变时并不会触发事件,但是在失去焦点的时候会触发. */ $("#inputid").change(function(){ console.log($(this). ...

  7. C++11实现生产者消费者问题

    生产者消费者问题是多线程并发中一个非常经典的问题.我在这里实现了一个基于C++11的,单生产者单消费者的版本,供大家参考. #include <windows.h> #include &l ...

  8. 实体写到redis写不进去--误把类当成实体类

    之前一直都把实体写入redis都没有问题,今天再次这样干,结果却是怎么写都写不进去,redis里的值老是为空 最后才发现把类当成了实体类,当然写不进去了. 把类: /// <summary> ...

  9. NPOI Excel 单元格背景颜色对照表

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

  10. (Collection)350. Intersection of Two Arrays II

    /* Given two arrays, write a function to compute their intersection. Example: Given nums1 = [1, 2, 2 ...