前言
日志是Linux系统的”黑匣子”,记录了系统运行状态、服务行为和错误信息。
[!IMPORTANT] 核心能力 熟练掌握日志查询和文本处理命令,是排查系统故障、监控服务状态和分析问题的核心能力。
本文将按功能分类详细讲解最常用的日志查询命令,标注重要性优先级,并提供大量实用示例,适用于Ubuntu、CentOS 9 Stream、银河麒麟和openEuler等所有主流Linux发行版。
一、日志实时查看与分页浏览命令
这类命令是日志查询的基础,用于快速查看日志内容和实时监控日志更新。
1. tail - 查看文件尾部内容(★★★★★ 最重要)
命令意义:显示文件的最后几行内容,最常用的功能是实时监控日志文件的更新。
基本语法:
tail [选项] 文件名常用参数:
-n N:显示最后N行(默认显示10行)-f:实时跟踪文件的新增内容(最常用)-F:与-f类似,但文件被删除或重建后会自动重新打开-c N:显示最后N个字节
# 显示文件最后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/messages2. less - 分页浏览文件(★★★★★ 最重要)
命令意义:功能强大的分页查看器,支持向前和向后翻页、搜索、跳转等操作,是查看大日志文件的首选工具。
[!TIP] 操作技巧 相比直接使用
cat打印整个文件,使用less可以在不加载整个大文件至内存的情况下进行高性能浏览。
常用操作快捷键:
空格键:向下翻一页 /b:向上翻一页Enter:向下翻一行 /k:向上翻一行G:跳转到文件末尾 /g:跳转到文件开头/关键词:向下搜索关键词 /?关键词:向上搜索关键词n:跳转到下一个匹配项 /N:跳转到上一个匹配项
# 分页查看日志文件less /var/log/messages
# 显示行号less -N /var/log/messages
# 忽略大小写搜索less -i /var/log/messages3. head - 查看文件头部内容(★★★★ 重要)
命令意义:显示文件的前几行内容,常用于快速查看文件开头的配置信息。
# 显示文件前10行head :spoiler[/etc/passwd]
# 显示文件前20行head -n 20 :spoiler[/etc/passwd]
# 显示文件前100个字节head -c 100 :spoiler[/etc/passwd]4. more - 分页浏览文件(★★ 一般)
命令意义:简单的分页查看器,功能比less弱,只能向下翻页,不能向上翻页。
# 分页查看文件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:递归搜索目录 / 只显示匹配内容的文件名
# 搜索包含"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/messages2. find 命令(★★★★ 重要)
一、命令概述
find 是 Linux 系统内置文件遍历搜索神器,实时遍历磁盘目录树,支持按文件名、文件类型、大小、修改时间、权限、所属用户等多维度条件筛选,还可搭配命令做批量处理,是运维日常最常用的核心命令。
NOTE
find实时扫描硬盘,结果精准无需更新数据库;区别于locate依赖索引库,适合生产环境精准检索。
二、基础语法
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 l3. 按文件大小搜索
单位:kKB、MMB、GGB;+大于、-小于、无符号等于
# 查找大于 100MB 的文件find . -size +100M
# 查找小于 10KB 的文件find . -size -10k4. 按时间筛选
-mtime:文件内容修改时间-atime:文件访问时间-ctime:文件属性修改时间 单位默认天,+nn天前,-nn天内
# 查找7天内修改过的文件find . -mtime -7
# 查找30天前未改动的文件find . -mtime +305. 按权限与属主搜索
# 查找权限为 755 的文件find . -perm 755
# 查找属于 root 用户的所有文件find / -user root四、匹配后批量执行动作
1. 批量删除匹配文件
# 递归删除所有 .log 日志文件find . -name "*.log" -delete2. 搭配 -exec 执行命令:{} \; 与 {} + 的深度对比
-exec 是 find 最强大的特性,它能把找到的文件直接交给后面的命令处理。但新手最容易懵的,就是结尾的 \; 和 +。我们先拆开看:
{}:占位符。代表find匹配到的每一个文件的完整路径。\;或+:结束符。告诉find你的命令写完了。
| 写法 | 执行逻辑 | 执行次数 | 效率 | 语法限制 |
|---|---|---|---|---|
-exec cmd {} \; | 每找到1个文件,就执行1次命令 | N个文件 → 执行N次 | 低(频繁创建进程) | {} 可放在命令任意位置 |
-exec cmd {} + | 把多个文件批量拼到命令后,一次执行 | N个文件 → 仅执行1~几次 | 高(进程开销极小) | {} 必须紧跟 +,且必须在命令末尾 |
直观对比示例:
假设找到 a.log、b.log、c.log 三个文件:
# 写法1:逐个执行,等价于运行3次lsfind . -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使用限制与避坑:
因为 + 要求 {} 必须放在末尾,所以当你需要把 {} 放在命令中间时,只能用 \;。
# 场景:把文件复制到 /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 /var/log/messages
# 统计文件的行数(最常用)wc -l /var/log/messages
# 统计包含"error"的行数grep "error" /var/log/messages | wc -l2. 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 文件名将结果直接写入目标文件 原地修改、避免重定向覆盖原文件
# 1. 基础排序:默认字典序升序排列sort file.txt
# 2. 数值排序:按数字大小升序 / 降序排列sort -n numbers.txtsort -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 | uniqsort -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 /etc/ssh/sshd_config /etc/ssh/sshd_config.bakvimdiff file1.txt file2.txt file3.txt2. diff - 命令行文件对比工具(★★★ 一般)
命令意义:传统的命令行文件对比工具,以文本方式显示两个文件的差异。
# 以统一格式显示差异(最常用)diff -u file1.txt file2.txt
# 递归对比两个目录diff -r dir1 dir2差异格式显示示例(Unified Diff):
--- file1.txt 2024-05-01 10:00:00+++ file2.txt 2024-05-10 12:00:00-Listen 80+Listen 8080五、命令与文件查找命令
1. which - 查找命令的绝对路径(★★★★ 重要)
# 查找ls、python命令的路径which ls python2. whereis - 查找命令及相关文件(★★★ 一般)
# 查找二进制文件(-b)和手册页(-m)whereis -b lswhereis -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 |
七、日志查询最佳实践
- 组合使用管道:可以通过管道
|将多个命令组合起来,实现复杂的文本处理。 - 使用正则表达式:grep和sed等工具支持正则表达式,掌握语法能极大提高筛选效率。
- 实时监控使用
tail -f:排查正在发生的问题时,监控日志流变化是第一要务。 - 统计分析:分析日志中的访问量、错误次数等信息时,
sort | uniq -c | sort -nr是最常用组合。
[!CAUTION] 严重警告 大日志文件绝对不要直接用
cat命令查看,否则会打满终端IO甚至引发系统内存不足告警!请一律替换为使用less或tail。
结语
本文讲解的这些命令是Linux系统管理员和开发者必备的核心技能。当你能熟练运用这些基础命令后,再去学习更高级的文本处理工具(如 awk、sed),以及现代化日志分析系统如 ELK Stack (可参考开源方案 ::github{repo=“elastic/elasticsearch”} ),就会变得水到渠成、更加容易。