grep搜索服务器日志(搜索指定关键字的行,按照日期group by count)

what’s grep

grep (globally search a regular expression and print,以正则表达式進行全域尋找以及列印)是一种强大的文本搜索工具,在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配的行或文本。十分灵活和强大

前言

grep的强大,在于他与其他命令一起的连用,从简单到复杂,拼接功能实现强大的逻辑

例如这么一个功能,需要各种神方法从服务器搜索日志:

  • 查找包含指定关键字的文件的文件名(包含某一错误信息的日志文件名,一般带有日期)
  • 查找包含指定关键字的文件的行(包含某一错误信息的行,一般带有行号或者错误位置或者日期等其他信息)
  • 输出包含指定关键字每天出现的次数(假设日志错误行包含有日期或者日志文件名包含日期)
  • 从固定格式的文件中输出指定行内容(适用于报文/批量等固定格式的文件)
  • 输出到日志文件(控制台不便于copy和整理)

需要

  • cd切换到日志文件的目录
  • Windows可以用 git bash 或者 装个cmder(推荐) ,Linux下直接使用原生Shell即可
  • 输出的日志文件会影响到查找的内容,主要不要输出在当前文件夹,或者输出后处理掉,避免影响结果(因为在同个目录下)
  • 正则表达式记不住没关系,从 https://tool.oschina.net/regex 找即可

可能会一起用到的命令

  • cat
  • awk
  • sed

实战

以下命令省略后面的>error500-x.txt 输出到文件的指令,需要请自行在尾部添加.

  1. 查找包含500错误的行内容并输出到error500.txt
grep -rn "HTTP protocol error 500 (Internal Server Error)"

控制台输出包含指定关键字的行

ServerLog_2020_01_07_08_02_39.log:685:          2020-01-07 08:02:42 0061                     'protocol error 500 (Internal Server Error): 3rd System API '
  1. 查找包含500错误的日期,-oE后面加正则表达式用于提取日期
grep -rn "HTTP protocol error 500 (Internal Server Error)" | grep -oE "([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))"

控制台输出
在这里插入图片描述

  1. 查找包含500错误的日期并进行分组统计,awk "{s[$1]+=1}END{ for(i in s){ print i, s[i] } }" 中的+=1代表遇到1个就累计加一,但那时有些情况需要累计加0.5,例如一行出现两个日期等等,根据实际情况修改
grep -rn "HTTP protocol error 500 (Internal Server Error)" | grep -oE "([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][ 0-9]|2[0-8])))"  | Sort |  awk "{s[$1]++}END{ for(i in s){  print i, s[i] } }"

控制台输出
在这里插入图片描述

  1. 输出固定行内容,470,470p代表输出第470行,470,480p代表输出470~480行.
sed -n '470,470p' SeverLog_2020_01_08_08_19_40.log

控制台输出

020-01-08 08:19:40 0169 Environment=PROD,v_user_id=zhengkai2020upupup

附录:grep命令参数大全

  • -a 或 --text : 不要忽略二进制的数据。
  • -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
  • -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -c 或 --count : 计算符合样式的列数。
  • -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  • -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
  • -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
  • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
  • -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
  • -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
  • -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
  • -i 或 --ignore-case : 忽略字符大小写的差别。
  • -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
  • -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -o 或 --only-matching : 只显示匹配PATTERN 部分。
  • -q 或 --quiet或–silent : 不显示任何信息。
  • -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
  • -s 或 --no-messages : 不显示错误信息。
  • -v 或 --revert-match : 显示不包含匹配文本的所有行。
  • -V 或 --version : 显示版本信息。
  • -w 或 --word-regexp : 只显示全字符合的列。
  • -x --line-regexp : 只显示全列符合的列。
  • -y : 此参数的效果和指定"-i"参数相同。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页