Linux 日志查找常用命令

1.1 cat、zcat

  • cat -n app.log | grep "error":查询日志中含有某个关键字error的信息,显示行号。

  • cat -n app.log | grep "error" --color:查询日志中含有某个关键字error的信息,显示行号,带颜色的。

  • cat -n test.log | tail -n +92 | head -n 20 :表示查询92行之后的日志;表示在前面的查询结果里再查前20条记录。

  • cat -n app.log |grep "error" | more:使用more和less命令分页查看日志,空格键翻页。

  • cat -n app.log |grep "error" > temp.txt:把日志保存到文件。

  • zcat shopdiy-job01.jd__shopdiy-job.warn.log-2019-03-25-1.log.gz | gerp "hotelFriendCircle poi":直接查找压缩包里的日志内容

  • gzip -dc app.log.2018-01-11.gz |grep "此次共实际刷数据" | more:不解压直接查看压缩包中的“关键词”信息

1.2 grep

  • grep -E "123|abc" app.log(grep -E "123|abc" app.log --color):查询日志文件app.log中包含 关键字 123 或 包含 关键字 abc 的行。(带颜色)

  • tail -f app.log | grep -E -C20 "123|abcd" --color:实时查看日志,且包含关键字 123 或者 abcd 的行。

  • grep -nE "123|abc" app.log:查询日志文件app.log中包含 关键字 123 或 包含 关键字 abc 的行,显示行号。

  • grep "此次共实际刷数据" app.log:查看日志中的关键字。

  • grep "此次共实际刷数据" app.log | more:查询关键字,并且按空格键翻页。

  • grep -i "magic" app.log :不分大小写的搜索匹配magic。默认情况下是区分大小写的。

  • grep -w "magic" app.log :匹配整个单词而不是字符串的一部分(如匹配“magic”,而不是“magical”)。

  • grep -E "123" app.log:显示app.log中含有关键字"123"的行内容。

  • grep -E -A5 "123" app.log:显示app.log中含有关键字"123"的行内容,以及之后的5行内容。

  • grep -E -B5 "123" app.log:显示app.log中含有关键字"123"的行内容,以及之前的5行内容。

  • grep -E -C5 "123" app.log:显示app.log中含有关键字"123"的行内容,以及之前之后的各5行内容。

1.3 head【头正尾负】

  • head -n 10 app.log(head -n +10 app.log、head 10 app.log):查看日志中的头10行日志。
  • head -n -10 app.log:查看日志中除了尾10行之外的所有日志。

1.4 tail【头正尾负】

  • tail -n 10 app.log(tail -n -10 app.log、tail -10 app.log):查看日志中的尾10行日志。

  • tail -n +10 app.log:查看日志中除了头10行之外的所有日志。

  • tail -f app.log:实时查看日志信息。

  • tail -f app.log |grep "关键词":实时查看日志中含有某个关键词的信息。

  • tail -f app.log |grep -A3 "关键词":实时查看日志中含有某个关键词的信息,该行的前面和后面各多显示3行。比如:tail -f app.log |grep -A3 "此次共实际刷数据"。

  • tail -f app.log |grep "mtUserScore" --color:实时查看app.log日志中的含有关键词“mtUserScore”的日志信息,并且彩色打印。

  • tail -n 20 app.log |grep --color "此次共实际刷数据":查看日志的最后20行并且搜索关键字。

  • tail -fn 100 app.log:循环实时查看最后100行的记录。

  • tail -fn 100 app.log |grep --color "此次共实际刷数据":循环查看最后100行的记录,并且查找关键字。

  • tail -500 /data/applogs/tomcat/catalina.out:查看Tomcat错误日志。

  • tail -f app.log | grep -A50 "randomFlow=" --color:查看后面50行的日志。tail -f app.log | grep -A50 "接口查询结果=" --color

  • tail -f app.log | egrep "repast launchId=|whtOuterCreativeService.generateCreative" --color:命中多个关键字中其中一个即可,注意:| 的前后不能有空格。

  • tail -f app.log | egrep "ERROR|WARN" --color:命中多个关键字中其中一个即可,注意:| 的前后不能有空格。

  • tail -f app.log | egrep "ERROR|WARN" -wc:统计数量,命中多个关键字中其中一个即可,注意:| 的前后不能有空格。

  • grep "modifyBudget" midas-shopdiy-web.access.log | grep "realAccountId=58754220" --color:同时满足两个条件。

  • tail -f nginx.access.log | grep -E "getPaginateList|queryAccounts" --color :匹配多个关键字之一即可

1.5 ps

  • ps -ef |grep java:查看Java进程。

  • ps -ef |grep tomcat:查看Tomcat进程。

  • curl www.baidu.com:查看url能不能使用。

  • ps -ef | grep 8080:查看端口号8080被哪个进程占用。

  • ps -ef | grep redis:查看已经启动所有进程中与字符“redis”相关的进程。

  • ps -ef | grep java:查看已经启动所有进程中与字符“java”相关的进程。

  • ping 192.168.1.122:查看本机能否和IP=192.168.1.122的主机连通。

  • scp -r redis-3.0.0/ 192.168.1.122:/usr/local:如果可以连通,则可以远程传输文件。

  • cp redis.conf /usr/local/redis-cluster/7001:复制文件到指定文件夹。

1.6 Nginx日志查询

  • 应用日志记录的位置:/data/applogs/shopdiy-web/logs

  • tail -f app.log:动态查看应用日志。

  • 应用Nginx日志记录的位置,HTTP请求时长结果查看:/data/applogs/nginx

  • tail -f shopdiy-web.access.log:通过访问页面来动态查看Nginx日志。

1.7 压缩包的解压-压缩

  • gz压缩:app.log-2018-09-22-1.log 文件,执行:gzip app.log-2018-09-22-1.log,被压缩成 app.log-2018-09-22-1.log.gz

  • gz接压缩:app.log-2018-09-22-1.log.gz 文件,执行:gzip -d app.log-2018-09-22-1.log.gz,被解压成 app.log-2018-09-22-1.log

  • gzip -dc app.log.2018-01-11.gz |grep "此次共实际刷数据" | more:不解压直接查看压缩包中的“关键词”信息

1.8 sed

  • 这个命令可以查找日志文件特定的一段 , 也可以根据时间的一个范围查询。

  • sed -n "5,10p" app.log:按照行数——查看日志第5到第10行。

  • sed -n "/2018-04-08 09:40:53.374/,/2018-04-08 10:21:04.812/p" express.log | grep "此次共实际刷数据" :按照时间段——查看两个时间之间的日志,并且显示关键字。其中,时间点一定要在日志中存在,可用:grep -E "2018-04-08 09:40:53.374" app.log --color:来查看时间点是不是存在日志中,带颜色。

1.9 lsof (list open files)

  • lsof -i tcp:查看TCP连接的端口号使用情况

  • lsof -i udp:查看UDP连接的端口号使用情况

  • lsof -i tcp:58528 :(port替换成端口号,比如6379)可以查看该端口被什么程序占用,并显示PID,方便kill

  • lsof -i udp:58529 :(port替换成端口号,比如6379)可以查看该端口被什么程序占用,并显示PID,方便kill

  • kill -9 518:结束进程PID号为518的进程

1.10 netstat

  • netstat -a:列出所有端口

  • netstat -at :列出所有tcp端口

  • netstat -au:列出所有udp端口

  • netstat -l :只显示监听端口

  • netstat -lt :只列出所有监听tcp端口

  • netstat -lu :只列出所有监听udp端口

  • netstat -st:显示 TCP 端口的统计信息

  • netstat -su:显示 UDP 端口的统计信息

1.11 ifconfig

ifconfig:Mac查看本机IP地址。其中的ether是硬件mac地址,inet是IP地址。另,可以参考这个知道:https://jingyan.baidu.com/article/b0b63dbf3fefd14a48307013.html

1.12 查看日志文件大小和查看指定关键词

(1)wc -c app.log:参数 -c 表示统计字符,因为一个字符是一个字节,所以这样得到字节数。

(2)du -sb app.log:参数 -b 表示以B计数。

(3)du -sm app.log:参数 -m 表示以M计数。

(4)du -sh app.log:参数 -h 表示以K/M/G计数,容易识别出文件大小 。

cd /data/applogs/nginx
ls -al
du -sh dp-nginx.access.log
查看这个文件中这个关键词被调用地方:
cat dp-nginx.access.log | grep "queryAccountBalance"
查看这个文件中这个关键词被调用的数量:
cat dp-nginx.access.log | grep "queryAccountBalance" | wc -l
查看这些文件中这个关键词被调用的数量:
cat dp-nginx.access* | grep "queryAccountBalance" | wc -l

另:less app.log使用:

(1) cd /data/applogs/shopdiy-cpc-job/logs
(2) ls -al
(3) 分页加载日志数据:less app.log
(4) 此时,shift+GG 命令进入文件尾部,然后输入 shfit+?,并且后面跟随你想要搜索的关键词,比如 ?NewCheckEntityStatusJob,回车,此时你想要看到的关键词都会加亮显示,供你查阅。
此时,N 是逐个向上翻阅;shift+N 是逐个向下翻阅。Q 是退出日志界面。

1.99 杂家笔记

  • less log.log:shift + GG 命令到文件尾部,然后输入 ?加上你要搜索的关键字例如 ?1213 shift+n 关键字之间进行切换。

  • tac:则是由最后一行到第一行反向在萤幕上显示出来,与cat反过来。

  • history:所有的历史记录

  • history | grep XXX:历史记录中包含某些指令的记录

  • history | more:分页查看记录

  • history -c:清空所有的历史记录

  • uname -a:查看内核/操作系统/CPU信息

  • cat /proc/cpuinfo:查看CPU详细信息

  • hostname:查看计算机名称

  • env:查看系统环境变量

  • free -m:查看内存使用量、查看交换区使用量

  • df -h:查看各分区使用量

  • du -sh 目录名:查看指定目录的大小

  • du -sh 文件名:查看指定文件的大小

  • grep MemTotal /proc/meminfo:查看计算机是多大内存,常用的是8G=8388608kB

  • grep MemFree /proc/meminfo:查看计算机还剩余多少内存

  • uptime:查看系统运行时间、用户数量、负载

  • ifconfig:查看所有网络接口的属性

  • netstat -lntp:查看所有监听的端口号

  • ps -ef:查看所有进程

  • top:实时显示进程状态

  • last:查看用户登录这台机器的日志

  • rpm -qa:查看系统上安装的所有的软件包

  • wc app.log:app.log文件的统计信息 3、92、598 app.log。app.log 文件的行数为3、单词数92、字节数598。

正则表达式

grep:grep详解

# grep默认是区分大小写的,这里将匹配所有的小写字母: $ echo '1234\nabcd' | grep '[a-z]' 
# 将匹配所有的数字: $ echo '1234\nabcd' | grep '[0-9]' 
# 将匹配所有的数字 :$ echo '1234\nabcd' | grep '[[:digit:]]' 
# 将匹配所有的小写字母 :$ echo '1234\nabcd' | grep '[[:lower:]]' 
# 将匹配所有的大写字母 :$ echo '1234\nabcd' | grep '[[:upper:]]' 
# 将匹配所有的字母和数字,包括0-9,a-z,A-Z :$ echo '1234\nabcd' | grep '[[:alnum:]]' 
# 将匹配所有的字母 :$ echo '1234\nabcd' | grep '[[:alpha:]]'
cat 1.txt | grep "[0-9]"
cat 1.txt | grep "[[:digit:]]"
cat 1.txt | grep "[[:alpha:]]"
cat 1.txt | grep "[[:upper:]]"
cat 1.txt | grep "[[:lower:]]"
cat 1.txt | grep "[[:alnum:]]"

grep简介

grep:Gloabal Search Regular Expression and Print out the line,意为全局搜索正则表达式并打印文本行。所以

  • grep是一个强大的文本搜索工具。

  • grep与正则表达式联系紧密。

之后也会从这两个大的方面来详细介绍。grep命令的基本语法如下:grep [options] pattern [file...]

  • options表示选项,具体的命令选项见下表。

  • pattern表示要匹配的模式(包括目标字符串、变量或者正则表达式)。

  • file表示要查询的文件名,可以是一个或者多个。pattern后面所有的字符串参数都会被理解为文件名。

选项 说明
-c 只打印匹配的文本行的行数,不显示匹配的内容
-i 匹配时忽略字母的大小写
-h 当搜索多个文件时,不显示匹配文件名前缀
-n 列出所有的匹配的文本行,并显示行号
-l 只列出含有匹配的文本行的文件的文件名,而不显示具体的匹配内容
-s 不显示关于不存在或者无法读取文件的错误信息
-v 只显示不匹配的文本行
-w 匹配整个单词
-x 匹配整个文本行
-r 递归搜索,搜索当前目录和子目录
-q 禁止输出任何匹配结果,而是以退出码的形式表示搜索是否成功,其中0表示找到了匹配的文本行
-b 打印匹配的文本行到文件头的偏移量,以字节为单位
-E 支持扩展正则表达式
-P 支持Perl正则表达式
-F 不支持正则表达式,将模式按照字面意思匹配

grep简单应用场景

首先介绍一下我的实验环境,在/Users/cmm/test4MingLing下建立3个简单的txt文件:

#----------------------/Users/cmm/test4MingLing/text1.txt--------------------- 
  hello world 
  mailx 
  uuen 
  letitia 
  #----------------------/Users/cmm/test4MingLing/text2.txt--------------------- 
  hello world,this is for grep test  
  #----------------------/Users/cmm/test4MingLing/text3.txt--------------------- 
  hello world 
  tyrone 


(1)多文件查询,file之间用空格隔开。

grep -i "hello world" text1.txt text2.txt
#输出结果
text1.txt:hello world
text2.txt:hello world,this is for grep test

(2)多模式匹配,模式之间为“逻辑或”的关系,匹配任意一个即可返回。

#方法1:使用-e选项 
grep -e "hello world" -e "mailx" -r /Users/cmm/test4MingLing
#方法2:使用正则表达式,-E
grep -E "hello world|mailx" -r /Users/cmm/test4MingLing
#方法3:使用正则表达式,egrep,同grep -E等效 
egrep "hello world|mailx" -r /Users/cmm/test4MingLing --color
#输出结果均相同: 
/Users/cmm/test4MingLing/text1.txt:hello world
/Users/cmm/test4MingLing/text1.txt:mailx
/Users/cmm/test4MingLing/text2.txt:hello world,this is for grep test
/Users/cmm/test4MingLing/text3.txt:hello world

(3)多模式匹配,模式之间为“逻辑与”的关系,匹配所有模式。
基本思想大致相同:先匹配一个模式,然后grep下面一个模式,将前一次grep的结果作为要查询文件路径依次向后传递。

PS:注意:前一次grep的结果必须加上 -l 选项,否则会把匹配成功的文件内容作为要查询的文件名向后传递。

我希望做到的是能够显示出同时包含模式的文件,并且跟随显示匹配每个模式的内容。可惜我现在找到的方法都仅仅能够显示匹配最后一个模式的内容。

#方法1:将其按一次的结果重定向到一个文件,然后 xargs grep 来依次读取。 
grep -i "hello world" -rl /Users/cmm/test4MingLing >> temp.txt
cat temp.txt |xargs grep -i "mailx"
#输出结果 
/Users/cmm/test4MingLing/text1.txt:mailx
 
#方法2:直接利用管道 
grep -i "hello world" -rl /Users/cmm/test4MingLing | xargs grep -i "mailx"
#输出结果 
/Users/cmm/test4MingLing/text1.txt:mailx

最后不得不感慨一下linux命令的组合方式,能像积木一样堆积出无穷的组合,是时候展现真正的想象力了。。。

(4)查找指定用户的进程
ps 是查看当前进程的指令,e 表示所有进程,f 表示全格式。

ps -ef |grep "cmm"
ps -ef |grep "cmm"
#输出结果 
  502   700     1   0  9:08上午 ??         0:00.03 /Applications/Google Chrome.app/Contents/Versions/70.0.3538.110/Google Chrome Framework.framework/Helpers/crashpad_handler --monitor-self-annotation=ptype=crashpad-handler --database=/Users/cmm/Library/Application Support/Google/Chrome/Crashpad --metrics-dir=/Users/cmm/Library/Application Support/Google/Chrome --url=https://clients2.google.com/cr/report --annotation=channel= --annotation=plat=OS X --annotation=prod=Chrome_Mac --annotation=ver=70.0.3538.110 --handshake-fd=9
    0   838   837   0  9:19上午 ttys001    0:00.02 login -pf cmm
    0  6133   837   0  2:28下午 ttys003    0:00.03 login -pf cmm
  502  7467  6134   0  3:54下午 ttys003    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn cmm
posted @ 2023-02-17 20:46  随★风  阅读(3052)  评论(0编辑  收藏  举报