4077 字
20 分钟
Linux基础(4):Linux日志查询相关命令

前言#

日志是Linux系统的”黑匣子”,记录了系统运行状态、服务行为和错误信息。

[!IMPORTANT] 核心能力 熟练掌握日志查询和文本处理命令,是排查系统故障、监控服务状态和分析问题的核心能力。

本文将按功能分类详细讲解最常用的日志查询命令,标注重要性优先级,并提供大量实用示例,适用于Ubuntu、CentOS 9 Stream、银河麒麟和openEuler等所有主流Linux发行版。

一、日志实时查看与分页浏览命令#

这类命令是日志查询的基础,用于快速查看日志内容和实时监控日志更新。

1. tail - 查看文件尾部内容(★★★★★ 最重要)#

命令意义:显示文件的最后几行内容,最常用的功能是实时监控日志文件的更新。

基本语法:

语法格式
tail [选项] 文件名

常用参数:

  • -n N:显示最后N行(默认显示10行)
  • -f:实时跟踪文件的新增内容(最常用)
  • -F:与-f类似,但文件被删除或重建后会自动重新打开
  • -c N:显示最后N个字节
tail_demo.sh
# 显示文件最后10行
tail /var/log/messages
# 显示文件最后20行
tail -n 20 /var/log/messages
# 实时监控日志文件(最常用)
tail -f /var/log/messages
# 实时监控多个敏感安全日志
tail -f /var/log/messages :spoiler[/var/log/secure]
# 显示最后100个字节
tail -c 100 /var/log/messages

2. less - 分页浏览文件(★★★★★ 最重要)#

命令意义:功能强大的分页查看器,支持向前和向后翻页、搜索、跳转等操作,是查看大日志文件的首选工具。

[!TIP] 操作技巧 相比直接使用 cat 打印整个文件,使用 less 可以在不加载整个大文件至内存的情况下进行高性能浏览。

常用操作快捷键:

  • 空格键:向下翻一页 / b:向上翻一页
  • Enter:向下翻一行 / k:向上翻一行
  • G:跳转到文件末尾 / g:跳转到文件开头
  • /关键词:向下搜索关键词 / ?关键词:向上搜索关键词
  • n:跳转到下一个匹配项 / N:跳转到上一个匹配项
less_demo.sh
# 分页查看日志文件
less /var/log/messages
# 显示行号
less -N /var/log/messages
# 忽略大小写搜索
less -i /var/log/messages

3. head - 查看文件头部内容(★★★★ 重要)#

命令意义:显示文件的前几行内容,常用于快速查看文件开头的配置信息。

head_demo.sh
# 显示文件前10行
head :spoiler[/etc/passwd]
# 显示文件前20行
head -n 20 :spoiler[/etc/passwd]
# 显示文件前100个字节
head -c 100 :spoiler[/etc/passwd]

4. more - 分页浏览文件(★★ 一般)#

命令意义:简单的分页查看器,功能比less弱,只能向下翻页,不能向上翻页。

more_demo.sh
# 分页查看文件
more /var/log/messages

二、文本内容搜索与过滤命令#

这类命令是日志查询的核心,用于从大量日志中快速筛选出感兴趣的内容。

1. grep - 文本搜索工具(★★★★★ 最重要)#

命令意义:Global Regular Expression Print缩写,Linux中最强大的文本搜索工具,支持正则表达式。

常用参数:

  • -i / -v:忽略大小写 / 反向匹配
  • -n / -c:显示匹配行号 / 只显示匹配的行数
  • -A N / -B N / -C N:显示匹配行及其 后N行 / 前N行 / 前后各N行
  • -E / -F:使用扩展正则 / 固定字符串不解析正则
  • -r / -l:递归搜索目录 / 只显示匹配内容的文件名
grep_search.sh
# 搜索包含"error"的行
grep "error" /var/log/messages
# 忽略大小写搜索"error"
grep -i "error" /var/log/messages
# 显示匹配行的行号
grep -n "error" /var/log/messages
# 显示不包含"error"的行 (过滤掉无效信息)
grep -v "error" /var/log/messages
# 显示匹配行及其前后各5行
grep -C 5 "error" /var/log/messages
# 统计包含"error"的行数
10 collapsed lines
grep -c "error" /var/log/messages
# 递归搜索当前目录下所有文件中的"error"
grep -r "error" .
# 使用扩展正则表达式搜索"error"或"warning"
grep -E "error|warning" /var/log/messages
# 搜索以"2024-05-10"开头的行
grep "^2024-05-10" /var/log/messages
# 搜索以"ERROR"结尾的行
grep "ERROR$" /var/log/messages

2. find 命令(★★★★ 重要)#

一、命令概述#

find 是 Linux 系统内置文件遍历搜索神器,实时遍历磁盘目录树,支持按文件名、文件类型、大小、修改时间、权限、所属用户等多维度条件筛选,还可搭配命令做批量处理,是运维日常最常用的核心命令。

NOTE

find 实时扫描硬盘,结果精准无需更新数据库;区别于 locate 依赖索引库,适合生产环境精准检索。

二、基础语法#

find 基础语法
find [搜索路径] [匹配条件] [执行动作]
  • 搜索路径:. 为当前目录,/ 全盘搜索,/etc 指定目录
  • 匹配条件:按名称、类型、大小、时间等筛选
  • 执行动作:默认打印路径,可执行删除、复制、改权限等

三、常用实战用法#

1. 按文件名搜索#
按文件名搜索
# 区分大小写查找后缀 .sh 文件
find . -name "*.sh"
# 忽略大小写查找 nginx 相关文件
find /etc -iname "*nginx*"
# 精准匹配指定文件名
find /root -name "nginx.conf"
2. 按文件类型搜索#

常用类型:f普通文件、d目录、l软链接、s套接字

按文件类型筛选
# 查找当前目录所有目录
find . -type d
# 查找系统所有软链接文件
find / -type l
3. 按文件大小搜索#

单位:kKB、MMB、GGB;+大于、-小于、无符号等于

按文件大小筛选
# 查找大于 100MB 的文件
find . -size +100M
# 查找小于 10KB 的文件
find . -size -10k
4. 按时间筛选#
  • -mtime:文件内容修改时间
  • -atime:文件访问时间
  • -ctime:文件属性修改时间 单位默认天,+n n天前,-n n天内
按时间搜索文件
# 查找7天内修改过的文件
find . -mtime -7
# 查找30天前未改动的文件
find . -mtime +30
5. 按权限与属主搜索#
按权限、用户筛选
# 查找权限为 755 的文件
find . -perm 755
# 查找属于 root 用户的所有文件
find / -user root

四、匹配后批量执行动作#

1. 批量删除匹配文件#
批量删除日志文件
# 递归删除所有 .log 日志文件
find . -name "*.log" -delete
2. 搭配 -exec 执行命令:{} \; 与 {} + 的深度对比#

-exec 是 find 最强大的特性,它能把找到的文件直接交给后面的命令处理。但新手最容易懵的,就是结尾的 \; 和 +。我们先拆开看:

  • {}:占位符。代表 find 匹配到的每一个文件的完整路径。
  • \; 或 +:结束符。告诉 find 你的命令写完了。
写法执行逻辑执行次数效率语法限制
-exec cmd {} \;每找到1个文件,就执行1次命令N个文件 → 执行N次低(频繁创建进程){} 可放在命令任意位置
-exec cmd {} +把多个文件批量拼到命令后,一次执行N个文件 → 仅执行1~几次高(进程开销极小){} 必须紧跟 +,且必须在命令末尾

直观对比示例:

假设找到 a.log、b.log、c.log 三个文件:

find -exec 性能对比
# 写法1:逐个执行,等价于运行3次ls
find . -name "*.log" -exec ls -lh {} \;
# 实际底层执行:
# ls -lh a.log
# ls -lh b.log
# ls -lh c.log
# 写法2:批量执行,等价于运行1次ls(文件越多,性能优势越恐怖)
find . -name "*.log" -exec ls -lh {} +
# 实际底层执行:
# ls -lh a.log b.log c.log

使用限制与避坑: 因为 + 要求 {} 必须放在末尾,所以当你需要把 {} 放在命令中间时,只能用 \;。

exec 占位符位置限制
# 场景:把文件复制到 /backup 目录
# 正确:\; 支持 {} 放在命令中间
find . -name "*.log" -exec cp {} /backup/ \;
# 错误:+ 要求 {} 在末尾,这样写会报错
find . -name "*.log" -exec cp {} /backup/ +

[!TIP] 和 xargs 的关系 -exec ... {} + 的效果几乎和 | xargs 等价。但前者更安全,因为它是 find 内部直接传参,天然兼容文件名带空格、中文的情况;而普通 xargs 遇到带空格的文件名极易拆错,必须配合 -print0 和 xargs -0 才能安全使用。

[!WARNING] 安全提示 使用 -delete 和批量删除命令前,建议先不加动作执行一遍,确认匹配文件无误再操作,防止误删系统文件。

五、多条件组合查询#

支持 -a 与、-o 或、! 取反逻辑

多条件组合搜索
# 查找当前目录下 .log 且大于 50M 的文件
find . -name "*.log" -a -size +50M
# 查找不是 .tmp 后缀的所有文件
find . ! -name "*.tmp"

六、进阶:-prune 排除指定目录(剪枝)#

在实际运维中,我们经常需要全局查找文件,但想跳过某些无关或极大的目录(如日志目录、临时目录等)以节省性能。这就是 -prune 的用武之地。

核心原理:-prune 是剪枝动作,当匹配到目录时,不进入、不递归里面的内容。

排除指定目录查找
# 查找包含 sh 的文件,但排除掉所有名为 temp 或 tmp 的目录
find . \( -type d -name "temp" -o -type d -name "tmp" \) -prune -o -type f -name "*sh*" -print

命令拆解:

部分作用
\( ... \)分组括号(Shell 中必须加反斜杠转义,两侧留空格),把两个目录条件绑在一起
-type d -name "temp" -o -type d -name "tmp"匹配名为 temp 或 tmp 的目录,-o = 逻辑或
-prune剪枝动作:匹配到上述目录时,直接跳过,不递归进去
-o逻辑或:前面的目录被跳过了,剩下没有被剪枝的路径继续执行后面的条件
-type f -name "*sh*"匹配普通文件,且文件名中包含 sh 字符
-print打印匹配结果。注意:用了 -prune 后必须显式加 -print,否则默认打印会失效

两种变体场景:

剪枝变体场景
# 场景1:只排除当前目录下的 ./temp 和 ./tmp,不排除子目录里同名的文件夹
find . \( -path "./temp" -o -path "./tmp" \) -prune -o -type f -name "*sh*" -print
# 场景2:不区分大小写匹配文件(把 -name 换成 -iname)
find . \( -type d -name "temp" -o -type d -name "tmp" \) -prune -o -type f -iname "*sh*" -print

[!CAUTION] 避坑指南 很多新手喜欢用 ! -path "*/temp/*" 来过滤目录。这样写虽然结果是对的,但 find 依然会完整遍历 temp 目录里面的所有文件,只是最后不把它们打印出来而已,遇到文件海量的目录会极大浪费性能。所以正规排除目录一律建议用 -prune。

三、文本统计与排序命令#

这类命令用于对日志内容进行统计分析和排序,帮助发现规律和问题。

1. wc - 文本统计命令(★★★★ 重要)#

命令意义:Word Count,统计文件的行数、单词数和字符数。

wc_stats.sh
# 统计文件的行数、单词数和字符数
wc /var/log/messages
# 统计文件的行数(最常用)
wc -l /var/log/messages
# 统计包含"error"的行数
grep "error" /var/log/messages | wc -l

2. sort - 文本排序命令(★★★★★ 最重要,重点讲解)#

命令意义:sort 是 Linux 文本处理体系中最核心的管道工具之一,用于对文本行按字典序、数值序或自定义字段规则完成排序,支持多字段组合排序、去重、忽略大小写等进阶能力。它几乎是所有日志统计、数据规整、频次分析场景的必用命令,常与 awk、uniq、grep 搭配组成完整的分析链路。

[!tip] 核心常用参数速查表

参数功能说明典型使用场景
-n按数值大小排序(默认按字符字典序)数字列表、统计次数排序
-r倒序/降序排序(默认升序排列)频次Top榜、数值从大到小排列
-k N按第N列字段排序,支持追加n/r指定单列规则结构化文本、多字段组合排序
-t 分隔符指定字段分隔符(默认空格/Tab)CSV文件、冒号分隔的系统配置排序
-u排序后自动去除重复行快速提取唯一值、简化去重流程
-f排序时忽略大小写差异英文日志、大小写混合的文本处理
-h识别K/M/G等单位,按人类可读大小排序文件大小、磁盘占用统计排序
-o 文件名将结果直接写入目标文件原地修改、避免重定向覆盖原文件
sort_practice.sh
# 1. 基础排序:默认字典序升序排列
sort file.txt
# 2. 数值排序:按数字大小升序 / 降序排列
sort -n numbers.txt
sort -nr numbers.txt
# 3. 忽略大小写排序
sort -f words.txt
# 4. 按空格分隔的第3列排序
sort -k 3 file.txt
# 5. 按逗号分隔的第2列数值排序(CSV场景)
sort -t ',' -k 2n file.csv
# 6. 排序并去重,等价于 sort | uniq
sort -u file.txt
# 7. 按人类可读单位排序(适配 K/M/G 后缀)
du -sh /* | sort -hr
# 8. 多列组合排序:先按第2列数值降序,再按第1列字典序升序
sort -k 2nr -k 1 access.log
# 9. 高频实战:统计Nginx日志IP访问次数,按访问量降序(TopIP分析)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 10. 高频实战:统计系统日志错误类型出现频次
grep "ERROR" /var/log/messages | awk '{print $5}' | sort | uniq -c | sort -nr

[!important] 易错提醒 不添加 -n 参数时,sort 会按字符逐个对比(字典序),此时 10 会排在 2 之前;涉及数字排序场景必须显式加上 -n,这是新手最容易踩的坑。

四、文件对比与差异查看命令#

1. vimdiff - Vim文件对比工具(★★★★ 重要)#

命令意义:基于Vim的文件对比工具,以可视化方式显示文件的差异,支持编辑和合并。

[!WARNING] 安全退出提示 请记住使用 :wqa 即可保存所有对比窗口的文件并安全退出环境。

vimdiff_demo.sh
# 对比两个或三个配置文件
vimdiff /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
vimdiff file1.txt file2.txt file3.txt

2. diff - 命令行文件对比工具(★★★ 一般)#

命令意义:传统的命令行文件对比工具,以文本方式显示两个文件的差异。

diff_demo.sh
# 以统一格式显示差异(最常用)
diff -u file1.txt file2.txt
# 递归对比两个目录
diff -r dir1 dir2

差异格式显示示例(Unified Diff):

config_diff_output.patch
--- file1.txt 2024-05-01 10:00:00
+++ file2.txt 2024-05-10 12:00:00
-Listen 80
+Listen 8080

五、命令与文件查找命令#

1. which - 查找命令的绝对路径(★★★★ 重要)#

which_demo.sh
# 查找ls、python命令的路径
which ls python

2. whereis - 查找命令及相关文件(★★★ 一般)#

whereis_demo.sh
# 查找二进制文件(-b)和手册页(-m)
whereis -b ls
whereis -m ls

六、常用命令组合速查表#

[!NOTE] 备忘录 善用管道符 | 是进阶 Linux 高手的必经之路。

功能命令组合
实时监控系统日志tail -f /var/log/messages
查看日志中所有错误grep -i error /var/log/messages
查看错误及其上下文grep -C 5 error /var/log/messages
统计IP访问次数awk '{print $1}' access.log | sort | uniq -c | sort -nr
查看访问量最高的10个页面awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -10

七、日志查询最佳实践#

  1. 组合使用管道:可以通过管道 | 将多个命令组合起来,实现复杂的文本处理。
  2. 使用正则表达式:grep和sed等工具支持正则表达式,掌握语法能极大提高筛选效率。
  3. 实时监控使用 tail -f:排查正在发生的问题时,监控日志流变化是第一要务。
  4. 统计分析:分析日志中的访问量、错误次数等信息时,sort | uniq -c | sort -nr 是最常用组合。

[!CAUTION] 严重警告 大日志文件绝对不要直接用 cat 命令查看,否则会打满终端IO甚至引发系统内存不足告警!请一律替换为使用 less 或 tail。

结语#

本文讲解的这些命令是Linux系统管理员和开发者必备的核心技能。当你能熟练运用这些基础命令后,再去学习更高级的文本处理工具(如 awk、sed),以及现代化日志分析系统如 ELK Stack (可参考开源方案 ::github{repo=“elastic/elasticsearch”} ),就会变得水到渠成、更加容易。

Linux基础(4):Linux日志查询相关命令
https://www.6ixblog.site/posts/linux-basic-4/
作者
Licwic
发布于
2025-01-05
许可协议
CC BY-NC-SA 4.0