Linux下查⽇志命令⼤全
Linux下查⽇志命令⼤全
grep
grep这个命令肯定是⼤家使⽤最多的了,但是这个命令到底怎么⽤呢,你都掌握了么?
grep:查⽂件中包含指定⽂本的命令
语法:grep "测试" test.log
解释:查test.log所有包含"测试"字符串的⾏
基本⽤法
这个是最基础的语法,但是仅仅是这远远不够,我们来看下它有哪些参数(只介绍最常⽤的⼀些参数):
-a或者-text: 不忽略⼆进制数据
-A<n>:显⽰匹配的⾏以及该⾏后n⾏
-
B<n>:显⽰匹配的⾏以及该⾏前n⾏
-C<n>:显⽰匹配的⾏以及该⾏前后n⾏
-c:显⽰匹配的⾏数总和(注意是⾏数,如果⼀⾏匹配到两个也算⼀⾏)
-H:显⽰匹配的⾏说属⽂件名linux查看当前文件夹内容
-i:不区分⼤⼩写
-n:显⽰匹配的⾏并⾏显⽰当前⾏数是多少
-r:查询⽂件夹下所有内容
-v:显⽰除匹配以外的内容(就是不包含的意思)
-w:匹配整个单词⽽不是字符串的⼀部分
举例:查test.log中有多少⾏包含"KingMouse"字符串
grep -c "KingMouse" test.log
⾼级⽤法
⼀次查多个⽂件
⽰例:grep “KingMouse” test1.log test2.log
但是更多 的还有⼀种情况,⽐如线上我们的服务产⽣的⽇志都是按照⼤⼩来分割的,⽐如:
test-error.log
test-error.log.1
test-info.log
test-info.log.1
test-info.log.2
test-info.log.3
那这个时候我们⽤-r就不⾏,因为我们不想查error⽂件中⽇志,那这个时候就可以⽤:grep "KingMouse" test-info.log.* 来查(⽣产上慎⽤,会⼤⼤增加cpu压⼒,最好确定范围再查)
正则表达式
注意:使⽤正则表达式的时候不要⽤双引号,⽽是要⽤单引号
场景:搜索⽇志中记录当前线程池空位信息
grep "线程池空位"
结果出来很多结果,如果我们此时急需要查记录线程池空位490-495之前怎么办呢?此时就需要⽤到正则表达式了:
‘grep ‘线程池空位49[0-5]’ test.log’
此时搜索出来的:
我们发现这样是不是简单很多,当然,关于正则表达式的还有很多,这⾥我就不说那么多,不会的⼩伙伴可以⾃⼰去搜下正则表达式!下⾯给⼀个分官⽹上的关于这个命令正则表达式规则说明:
^    # 锚定⾏的开始如:'^grep'匹配所有以grep开头的⾏。
$    # 锚定⾏的结束如:'grep$' 匹配所有以grep结尾的⾏。
.    # 匹配⼀个⾮换⾏符的字符如:'gr.p'匹配gr后接⼀个任意字符,然后是p。
*    # 匹配零个或多个先前字符如:'*grep'匹配所有⼀个或多个空格后紧跟grep的⾏。
.*  # ⼀起⽤代表任意字符。
[]  # 匹配⼀个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^]  # 匹配⼀个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的⼀个字母开头,紧跟rep的⾏。
\(..\)  # 标记匹配字符,如'\(love\)',love被标记为1。
\<      # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的⾏。
\>      # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的⾏。
x\{m\}  # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的⾏。
x\{m,\}  # 重复字符x,⾄少m次,如:'o\{5,\}'匹配⾄少有5个o的⾏。
x\{m,n\}  # 重复字符x,⾄少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的⾏。
\w    # 匹配⽂字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个⽂字或数字字符,然后是p。
\W    # \w的反置形式,匹配⼀个或多个⾮单词字符,如点号句号等。
\b    # 单词锁定符,如: '\bgrep\b'只匹配grep。
多条件查
1、或操作
grep '123|abc' test.log 查test.log中包含123或者abc的⾏
2、与操作
grep '123' test.log | grep 'abc' 查test.log中包含123同时也包含abc的⾏
head
其实整个命令我本⼈⽤的不是很多,不过偶尔也⽤,head其实很好理解,就是头的意思嘛,所以他可以⽤来查看当前⽇志⽂件开头内容⽐如查看⽂件前10⾏ head -10 test.log
tail
这个命令⽣产上⽤的也不是很多吧,⼤概就是调试的时候⽤的⽐较多,⽐如我们想要实时查看当前服务⽇志:tail -f test.log,效果类似本地控制台吧
再或者我们需要最新的100⾏内容(⽂件末尾100⾏):tail -100 test.log
sed
这个命令很重要,应为⽣产上⽇志⽂件⼀般都是⾮常⼤的,我们要在⼀个很⼤的⽇志中搜索或者下载某部分内容相当不容易,此时可以⽤sed命令
查看某⼀段时间内的⽇志(⽇志输出需要有时间才可)
查看2020年3⽉27号上午9点到夜晚9点中间的⽇志
sed -n '/2020-03-27 09:00/,/2020-03-27 21:59/p' test.log
搜索某段时间内的⽇志
搜索2020年3⽉27号上午9点到夜晚9点中包含"kingmouse" 字符串的⾏数
sed -n '/2020-03-27 09:00/,/2020-03-27 21:59/p' test.log | grep -c "kingmouse"
将某段时间内的⽇志保存到⼀个新的⽂件中
将2020年3⽉27号上午9点到夜晚9点时间段内所有⽇志保存到当前⽬录下
sed -n '/2020-03-27 09:00/,/2020-03-27 21:59/p' test.log > newfile.log
关于sed命令⽤法还有很多,这⾥我给⼤家介绍最长⽤的,其他的可以去⾃⾏了解下
终极奥义 awk
awk是在过于强⼤,本⼈也是在学习探索中,今天我就来给⼤家说其中⼀种⽤法:拆分,类似java中的split()⽅法
最常⽤的,⽐如rest接⼝会默认打印接受的参数信息:
2020-03-27 10:16:05.615 cs_ccc_smartivr 10.172.54.145 kingmouse [http-nio-8080-exec-5] INFO  c.h.h.system.log.ControllerAspect[48] [CallId :  , Contac tId : ] [TxId : -2006951347.113.15852753656100767 , SpanId : ]- Controller CLASS.METHOD : com.ller.IvrFlowEngineController.quer y Args : [1585275342-66529420200327101605608, 1585275342-665294, 131********, 0, null, null, 100100311, 1800130, 2, 0, 0, 1, null, 255, null, null, 131********, null, org.springframework.security.web.firewall.FirewalledResponse@11bd369a]
如果我们想看⼀下某个参数,⽐如第⼆个参数是啥,我只想看第⼆个参数
那么我们可以这样:
1、查出当前和这个接⼝记录的内容
grep "com.ller.IvrFlowEngineController.query Args" test.log > test2.log
2、将每⾏按照逗号拆分并输出第⼆个参数
awk -F ',' '{print $4}' test2.log
有⼈说为什么不是2⽽是4,为什么说和java的split()⽅法类似呢,他是以都逗号分隔,钱数前⾯还存在逗号,所以就不是第⼆个了,这个⾃⼰⼤家数⼀下就好
你以为到这⾥就结束了?no!
我们刚刚输出了第⼆个参数,如果我需要判断当第⼆个参数不等于null的时候输出,等于null就不输出
awk -F ',' '$4 ~/null/{print $4}' test2.log
再增加点难度,⽐如我想判断第⼆个参数不等于null并且去重然后再统计⾏数
awk -F ',' '$4 ~/null/{print $4}' test2.log|sort|uniq|wc -l
解释:
uniq:去重,⼀般配合sort使⽤
wc -l:统计⾏数
好了,今天的知识分享到这⾥了,我这⾥介绍的知识众多命令中的冰⼭⼀⾓,⽽我也是把我平时使⽤最多的拿出来和⼤家分享下!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。