本人菜鸡一只,对于正则其实真是菜的抠脚!所以得赶紧记下来,不然下次又忘了!!
遇到了个场景,程序的运行日志中,有部分信息我们是想要的,需要进行一些基础的分析。
日志拿到手上,里面可能有上万条日志,但是我们只需要其中一部分。
处理方式有非常多
1、通过各种语言io流读取日志,判断读入的行中是否包含某些字段是我们需要的
2、把日志加载到某些“容器”中,比如数据库啊,es啊等等的,然后通过对应的语法,filter出我们想要的行!
但是,说实话,如果能不做任何处理(一般服务是部署在linux上,所以运行日志也是在linux上的),直接通过linux命令行来处理是最方便的
3、linux命令行,来过滤我们想要的日志
所以选择使用grep命令
所以我先说grep命令几个比较常用的参数
参数 | 注释 | 用法 |
--color | 匹配到的数据变红 | grep --color '要匹配的行的特征' |
-A | 查看后几行数据 | 查看匹配的行的后十行:grep -A 10 '要匹配的行的特征' |
-B | 查看前几行数据 | 用法和-A一样 |
-i | 无视大小写 | grep -i '要匹配的行的特征' |
-v | 反选,不保留匹配到的数据 | grep -v '要匹配的行的特征' |
其实grep是可以使用正则的匹配的,但是他当中的所有特殊符号都需要转义!!!
看看一下的具体例子:
#查看日志中,包含“表名:”或者“包含SQL:”的行!
cat 2019-02-22.log | grep "^\(表名:\|SQL:\).*$"
#查看日志中,包含“表名:”或者“包含SQL:”的行!,但是还需要过滤掉select语句
cat 2019-02-22.log | grep "^\(表名:\|SQL:\).*$" | grep -v -i 'select'
#查看日志中,将这部分日志追加到某个文件中
#如果是覆盖,就使用 ">"
cat 2019-02-22.log | grep "^\(表名:\|SQL:\).*$" | grep -v -i 'select' >> 20190222.log
4、另外我在说下find命令的一些东西
find命令的一些具体的用法,我就不说了,一般这个是在有些文件我们实在找不到的时候才去使用的
-1.find正常用法
find 在哪个目录中查找 拼接一些参数-name,-type,-size,-mtime... 加上匹配的内容
具体我就不展开了,因为毕竟简单网上也很多可以找到的,
例如:https://blog.51cto.com/13869554/2151557(作者:fengchen51)
这里主要说说find怎么使用正则来匹配查找的文件
-2.-name是不能写正则来查找文件的!
因此如果要实现根据正则,查询文件夹下的文件,就需要使用 -regex ,也可以指定通过 -regextype 指定支持的正则类型
type: 如果不使用选项 -regextype "type", 则默认的正则表达式类型是emacs,使用该选项的话,type 类型包括 posix-awk, posix-basic, posix-egrep 和 posix-extended 四种,具体区别其实我也不太懂,正则确实在不同环境下会有细微的区别,大家使用前多测试下就好了
下面来说一个实例:
我想要查某个文件夹下修改时间一天以内,以abc为开头,以tar.gz或者zip结尾的文件,并且查询出来排个序,因此如下
find 目标路径 -regextype posix-extended -regex ".*?abc.*(zip|tar.gz)$" -mtime -1 | sort
!!注意:这里使用正则千万要注意!
find命令查询出来是全路径+文件名,所以正则匹配的时候要从路径开始匹配
比如你查当前目录的,匹配出来的文件是:
./abcxxxxxx.zip
./abcxxxxxx.zip
这时候如果你正则写的是abc开头,那这个数据你就永远都匹配不到!!因为数据是./开头的!!
所以查询的时候跟你输入的目标路径也是有关系的,请大家注意!!!!
这里还是要提一句,不管什么需求,都要尽量用最简单的方式来做(不要搭上一大堆框架,因为东西多了,不好开发,也不好维护,出了问题,也要一个框架一个框架查,很麻烦!!!!)
好了,所以很短的文章,记录很简单的问题!(这篇文章说不定会更新,记录下linux其他的命令的问题)
我是菜鸡,下次再见,拜拜~~!