作为一名后端程序员,和Linux打交道的地方很多,不会看Linux日志,非常容易受到来自同事和面试官的嘲讽,所以掌握一种或者几种查看日志的方法非常重要。
Linux查看日志的命令有多种: tail、cat、tac、head、echo等,本文只介绍几种常用的方法。
grep命令
Linux 文本操作的三大神器:grep、sed、awk。
各自的最佳应用场景:
- grep:使用正则表达式搜索文本,并把匹配的行打印出来,是强大的文本搜索工具;
- sed:用于编辑匹配到的文本,是一种流编辑器;
- awk:能够对文本进行复杂的格式处理,是一种处理文本的语言。
我们首先要学习grep命令。
命令功能
grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。主要功能是在文件中查找/过滤所需要的内容。
比如查看 ip 地址的命令:
ifconfig | grep inet
命令格式
格式:grep [option] pattern file
其中,option 是 grep 命令的参数,pattern 是所需查找/过滤的内容,file 是指定的文件。
命令参数
- -A<显示行数>:除了显示匹配 pattern 的那一行外,显示该行之后的内容
- -B<显示行数>:除了显示匹配 pattern 的那一行外,显示该行之前的内容
- -C<显示行数>:除了显示匹配 pattern 的那一行外,显示该行前、后的内容
- -c:统计匹配的行数
- -e:同时匹配多个pattern
- -i:忽略字符的大小写
- -n:显示匹配的行号
- -o:只显示匹配的字符串
- -v:显示没有匹配pattern的那一行,相当于反向匹配
- -w:匹配整个单词
grep应用示例
比如有一个hello.txt,内容如下:
aaa
bbb
ccc
aaaAAA
bbbBBB
cccCCC
helloworld
hello world
通过设定不同命令参数的示例如下:
同时匹配多个pattern(-e)和忽略大小写(-i)很方便查找:
显示行号(-n)可以快速定位:
反向匹配(-v)也经常用到:
常用的正则表达式
常用的正则表达式:
- .:任意单个字符
- *:任意字符多次
- []:指定范围,如[0-9]、[a-z]、[A-Z]、[0-9a-zA-Z]
- ^:行首
- $:行尾
- ^$:空行
比如有一个hello.txt,内容如下:
使用正则表达式的匹配示例:
常用语法总结
过滤以“abc”开头的行:grep "^abc"
过滤不包含"abc"的行:grep -v "abc"
过滤包含"abc"的行并查看最后两行:grep "adb" | tail -n 2
过滤包含"abc"的行并查看最前面一行:grep -m 1 "adb"
过滤包含"abc"的行并查看第一项(和上面的区别是,如果如果第一行有多个匹配项,上面会显示整行,这里只会显示第一行的第一项):grep -m 1 "adb" | head 1
过滤包含"abc"的行并显示前面两行和后面三行:grep -B2 -A3 "adb"
过滤包含"abc"的行并显示前面两行和后面两行:grep -C2 "adb"
tail命令
命令格式:
tail [参数] [文件]
参数:
- -f 循环读取
- -q 不显示处理信息
- -v 显示详细的处理信息
- -c<数目> 显示的字节数
- -n<行数> 显示行数
- -q, --quiet, --silent 从不输出给出文件名的首部
- -s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
用法如下:
tail -n 10 test.log 查询日志尾部最后10行的日志;
tail -n +10 test.log 查询10行之后的所有日志;
tail -fn 1000 test.log 循环实时查看最后1000行记录(最常用的)
一般还会配合着grep用,例如:
tail -fn 1000 test.log | grep '关键字'
如果一次性查询的数据量太大,可以进行翻页查看,例如:
tail -n 4700 aa.log |more -1000 可以进行多屏显示(ctrl + f 或者 空格键可以快捷键)
head命令
跟tail是相反的head是看前多少行日志。
head -n 10 test.log 查询日志文件中的头10行日志;
head -n -10 test.log 查询日志文件除了最后10行的其他所有日志;
head其他参数参考tail。
cat命令
cat 是由第一行到最后一行连续显示在屏幕上。
一次显示整个文件:
cat -n filename
从键盘创建一个文件:
cat > filename
将几个文件合并为一个文件:
cat file1 file2 > file 只能创建新文件,不能编辑已有文件
将一个日志文件的内容追加到另外一个:
cat -n textfile1 > textfile2
清空一个日志文件:
cat : >textfile2
注意:> 意思是创建,>>是追加。千万不要弄混了。
cat也可以跟tail一样使用grep进行关键字的过滤。
如果需要实现多个关键字同时包含,可以进行“与”操作,例如:
cat test.log| grep "abc" | grep "123"
如果需要打印出文件test.log中匹配包含“abc"或者包含"123"的行,可以用如下方式:
cat test.log | grep "abc|123"
more命令
more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)。more命令从前向后读取文件,因此在启动时就加载整个文件。
该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:–More–(XX%)
- more的语法:more 文件名
- Enter 向下n行,需要定义,默认为1行
- Ctrl f 向下滚动一屏
- 空格键 向下滚动一屏
- Ctrl b 返回上一屏
- = 输出当前行的行号
- :f 输出文件名和当前行的行号
- v 调用vi编辑器
- !命令 调用Shell,并执行命令
- q退出more
sed命令
这个命令可以查找日志文件特定的一段 , 根据时间的一个范围查询,可以按照行号和时间范围查询。
按照行号:
sed -n '5,10p' filename 这样你就可以只查看文件的第5行到第10行。
按照时间段:
sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log
less命令
less命令在查询日志时,一般流程是这样的:
less log.log
shift + G 命令到文件尾部 然后输入 ?加上你要搜索的关键字例如 ?1213
按 n 向上查找关键字
shift+n 反向查找关键字
less与more类似,使用less可以随意浏览文件,而more仅能向前移动,不能向后移动,而且 less 在查看之前不会加载整个文件。
less log2013.log 查看文件
ps -ef | less ps查看进程信息并通过less分页显示
history | less 查看命令历史使用记录并通过less分页显示
less log2013.log log2014.log 浏览多个文件
常用的命令参数:
less与more类似,使用less可以随意浏览文件,而more仅能向前移动,不能向后移动,而且 less 在查看之前不会加载整个文件。
less log2013.log 查看文件
ps -ef | less ps查看进程信息并通过less分页显示
history | less 查看命令历史使用记录并通过less分页显示
less log2013.log log2014.log 浏览多个文件
常用命令参数:
-b <缓冲区大小> 设置缓冲区的大小
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
/字符串:向下搜索"字符串"的功能
?字符串:向上搜索"字符串"的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
b 向后翻一页
h 显示帮助界面
q 退出less 命令
一般本人查日志配合应用的其他命令:
history // 所有的历史记录
history | grep XXX // 历史记录中包含某些指令的记录
history | more // 分页查看记录
history -c // 清空所有的历史记录
!! 重复执行上一个命令
查询出来记录后选中 : !323
/var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
/var/log/wtmp 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件
指定日志时间段
grep -E '2020-07-21 1[1-2]:[5-0][8-5]:[0-5]0' out.log
grep -E '2020-07-21 11:5[8-9]:[0-5][0-9]|2020-07-21 12:0[0-5]:[0-5]0' out.log
grep -E 选项可以用来扩展选项为正则表达式。如果使用了grep 命令的选项-E,则应该使用 | 来分割多个pattern,以此实现OR操作。
sed -n '/2020-07-21 11:58:00/,/2020-07-21 12:05:50/p' out.log
sed 选项说明:
- -n选项:只显示匹配处理的行(不加会输出所有)
- -p选项:打印
-n 和-p 经常一起使用。
在日志文件中查找关键字前后多少行
方式一:
(1)cat -n pom.xml | grep abc
上面的命令是打开pom.xml文件,并显示行号,查找关键字abc,这个-n就是显示pom.xml这个文件的行号。
(2)cat -n pom.xml | tail -n +13 | head -n 6
tail -n +13意思是从文件的第13行往后显示,head -n 6 的意思是显示13行后的6行
总结:先求得关键字的行号,比如求得关键字的行号是100行。
方式二:
- cat filename |grep 关键字 -C10 上面显示关键字的前后10行 -C显示前后多少行
- cat filename |grep 关键字 -A10 上面显示关键字的后10行 -A显示后多少行
- cat filename |grep 关键字 -B10 上面显示关键字的前10行 -B显示前多少行
本文摘自 :https://www.cnblogs.com/