50 个日志分析必备Linux 命令 懂一半绝对高手!

50 个日志分析必备Linux 命令 懂一半绝对高手!

原创 数安智信 [运维网工](javascript:void(0) 2025年07月20日 09:40 重庆
https://mp.weixin.qq.com/s/L5fZoxoIr4SLdFU7ouSy7g

在Linux系统的运维、开发和故障排查中,日志分析是至关重要的环节。面对海量、分散的日志文件,熟练掌握命令行工具是高效定位问题、发现异常、进行监控和审计的基础。本文系统性地梳理了从日志收集、基础查看、文本处理、统计汇总到实时监控和异常检测全流程中不可或缺的50个Linux命令。掌握它们,你将拥有驾驭日志的“瑞士军刀”。

一、 日志收集与定位

  1. find: 强大的文件搜索工具。按名称、类型、大小、时间戳等属性递归查找日志文件。例如:find /var/log -name "*.log" -mtime -1 (查找/var/log下24小时内修改过的.log文件)。
  2. locate / mlocate: 利用预建数据库快速查找文件路径。适合已知部分文件名时快速定位日志位置(需先运行updatedb更新数据库)。locate syslog
  3. which: 显示给定命令的完整路径。确认日志分析工具(如grep, awk)的位置。which grep
  4. whereis: 查找命令的二进制文件、源代码和手册页位置。比which信息更全面。whereis awk

二、 基础查看与导航

  1. cat: 连接文件并打印到标准输出。查看小型日志文件的全部内容。cat /var/log/messages。 (警告:切勿用于大文件!)
  2. tac: 逆序打印文件内容。查看日志结尾(最新内容)时有用。tac /var/log/syslog | head -n 20
  3. head: 显示文件开头部分内容。默认显示前10行。head -n 100 /var/log/nginx/access.log (查看前100行)。
  4. tail: 显示文件结尾部分内容。默认显示最后10行。tail -n 50 /var/log/auth.log (查看最后50行)。
  5. less: 功能强大的分页阅读器。支持大文件浏览、搜索(/)、跳转(G/g)、反向搜索(?)、过滤(&模式)等。查看日志的首选less /var/log/kern.log
  6. more: 基础的分页阅读器(功能弱于less)。按空格翻页,Enter下一行。more /var/log/dpkg.log
  7. nl: 在输出的每行前添加行号。便于定位特定行。nl application.log | less
  8. file: 确定文件类型。确认日志是文本文件、压缩文件还是其他格式。file /var/log/lastlog

三、 核心文本处理与过滤

  1. grep: 最核心的文本搜索工具。使用正则表达式匹配行。日志过滤的基石。
  • grep "ERROR" app.log (查找包含"ERROR"的行)
  • grep -i "warning" system.log (-i忽略大小写)
  • grep -v "INFO" debug.log (-v反向匹配,排除包含"INFO"的行)
  • grep -E "Err(or)?|Fail" (-E使用扩展正则表达式,匹配"Error", “Err”, “Fail”)
  • grep -A 3 -B 2 "Exception" trace.log (-A N显示匹配行后N行, -B N显示匹配行前N行, -C N显示前后各N行)
  • grep -r "connection refused" /var/log/ (-r递归搜索目录)
  1. egrep: 等同于grep -E,使用扩展正则表达式(ERE)。

  2. fgrep / grep -F: 固定字符串搜索,不解析正则元字符,速度快。

  3. awk: 强大的文本处理和数据提取语言。按字段处理文本行是日志分析的超级利器。

    • awk '{print $1, $4}' access.log (打印第1和第4个字段,默认空格分隔)
    • awk -F':' '{print $1}' /etc/passwd (-F指定字段分隔符为’
    • awk '/ERROR/ {count++} END {print count}' app.log (统计"ERROR"出现次数)
    • awk '$9 == 404 {print $7}' access.log (查找状态码为404的请求的URL)
  4. sed: 流编辑器。用于对文本流进行过滤和转换(替换、删除、插入等)。

    • sed 's/foo/bar/g' logfile (将每行中所有"foo"替换为"bar")
    • sed '/DEBUG/d' app.log (删除包含"DEBUG"的行)
    • sed -n '10,20p' system.log (仅打印第10到20行, -n抑制默认输出, p打印)
    • sed -i.bak 's/old/new/' file (-i原地编辑文件,.bak创建备份)
  5. cut: 按列(字段)提取文本。

    • cut -d' ' -f1,5 access.log (-d指定分隔符空格, -f指定提取第1和第5个字段)
    • cut -c1-10 timestamp.log (-c按字符位置提取第1到10个字符)
  6. paste: 水平合并多个文件的行。paste file1 file2

  7. join: 基于共同字段合并两个已排序文件的行。join file1 file2

  8. sort: 对文本行进行排序。

    • sort access.log (默认按整行升序)
    • sort -n -k 3 data.log (-n按数值排序, -k 3指定按第3个字段)
    • sort -r -u error_codes.log (-r降序, -u去重)
  9. uniq: 报告或忽略重复的行。通常与sort连用,因为uniq只检测连续的重复行。

- • `sort app.log | uniq -c` (`-c`在每行前显示重复次数)
- • `sort app.log | uniq -d` (`-d`只显示重复的行)
- • `sort app.log | uniq -u` (`-u`只显示唯一的行)
  1. tr: 字符转换或删除工具。

    • tr '[:lower:]' '[:upper:]' < logfile (小写转大写)
    • tr -d '\r' < windows.log > unix.log (删除Windows换行符\r)
    • tr -s ' ' < logfile (-s压缩连续重复字符为单个空格)
  2. wc: 统计文件的行数、单词数、字节数。

    • wc -l access.log (-l统计行数)
    • wc -c largefile.log (-c统计字节数)
    • wc -w report.txt (-w统计单词数)
  3. diff: 比较两个文件的差异。分析配置文件变更或不同时间点的日志差异。diff config-old.conf config-new.conf

  4. comm: 逐行比较两个已排序文件,输出三列:只存在file1的行、只存在file2的行、共有的行。comm -12 file1 file2 (仅显示共有的行)。

  5. column: 将输入格式化为整齐的列。美化psmount等命令的输出或特定格式的日志。ps aux | column -t (-t自动识别分隔符并制表)。

四、 统计、汇总与格式转换

  1. awk (再次强调): 强大的统计和报表生成能力(如上面统计ERROR次数的例子)。

  2. sort | uniq -c (组合): 统计元素出现频率的经典组合。cut -d' ' -f1 access.log | sort | uniq -c | sort -nr (统计访问IP频率并降序排列)。

  3. jq: 专门处理JSON数据的命令行工具。现代应用日志(如Docker、K8s、API服务)常为JSON格式,jq是解析、筛选、转换的必备工具。

  • cat log.json | jq '. | {timestamp: .ts, level: .lvl, message}' (提取特定字段)
  • jq 'select(.level == "ERROR")' app.log (筛选ERROR级日志)
  • jq '.response_time | max' metrics.json (计算最大响应时间) (需安装)
  1. xmlstarlet: 强大的XML命令行工具包。处理XML格式的日志或配置文件。xmlstarlet sel -t -v "//error/message" errors.xml (需安装)

  2. csvkit (工具集): 包含csvlook, csvcut, csvgrep, csvstat等,专门处理CSV格式数据。分析结构化日志或导出数据时非常有用。csvcut -c date,status access.csv | csvstat (需安装)

五、 实时监控与跟踪

  1. tail -f / tail -F: 实时追踪文件末尾新增内容。监控日志滚动的标准方法。
  • tail -f /var/log/apache2/error.log (持续输出新增行)
  • tail -F /var/log/app/*.log (-F-f更健壮,跟踪文件名变化(如日志轮转))
  1. less +F: 在less中进入类似tail -f的实时跟踪模式(按Ctrl+C退出跟踪,F重新进入)。

  2. multitail: 高级工具,可在一个终端窗口同时监控多个文件,支持颜色高亮、过滤等。监控多个相关日志流的绝佳选择。multitail -i /var/log/nginx/access.log -i /var/log/nginx/error.log (需安装)

  3. watch: 定期重复执行指定命令并全屏输出结果。监控动态变化。

    • watch -n 2 "netstat -tulpn | grep :80" (每2秒刷新一次监控80端口连接)
    • watch -d 'grep "CPU" /proc/stat' (-d高亮显示变化部分)
  4. dmesg: 查看和控制内核环形缓冲区。诊断硬件错误、驱动问题、系统启动早期信息。dmesg | grep -i error, dmesg -T (显示可读时间戳), dmesg -w (实时监控新消息)。

  5. journalctl: 查询和显示由systemd管理的系统日志 (journal)。现代Linux发行版的核心日志工具。

    • journalctl (查看全部日志)
    • journalctl -u nginx.service (-u按服务单元过滤)
    • journalctl -p err..alert (-p按优先级过滤,err到alert)
    • journalctl --since "2024-01-01 00:00:00" --until "2024-01-02 12:00:00"
    • journalctl -f (实时跟踪, 类似tail -f)
    • journalctl _PID=1234 (按进程ID过滤)
    • journalctl --disk-usage (查看日志占用的磁盘空间)

六、 文件与内容操作

  1. touch: 更改文件时间戳或创建空文件。有时用于标记日志分析状态或创建占位文件。touch analysis_complete.flag

  2. mkdir: 创建目录。组织日志分析工作空间。mkdir logs_analysis && cd $_

  3. cp / mv: 复制/移动文件或目录。备份日志或整理文件。cp critical.log{,.bak}, mv old_logs/ archive/

  4. rm: 删除文件或目录。慎用! 清理临时分析文件。rm *.tmp

  5. ln: 创建文件链接(硬链接或符号链接)。方便访问常用日志文件。ln -s /var/log/nginx/access.log nginx_access

  6. chmod / chown: 更改文件权限/所有权。有时需要调整权限才能访问日志(但应遵循最小权限原则)。sudo chmod o+r /var/log/app/protected.log (谨慎使用!)。

  7. tee: 从标准输入读取并写入标准输出和文件。在管道中保存中间结果或同时输出到屏幕和文件。

    • grep "WARN" app.log | tee warnings.txt | less
    • sudo tcpdump port 80 | tee packet_capture.log (需要权限)

七、 系统状态与进程监控 (辅助上下文分析)

  1. top / htop: 实时动态查看系统进程活动及资源(CPU、内存)占用情况。htop功能更强大、界面更友好。top, htop

  2. ps: 报告当前进程快照。查找与日志相关的进程及其PID。

    • ps aux | grep java (查找Java进程)
    • ps -ef -p 5678 (查看PID为5678的进程详细信息)
  3. free / vmstat: 查看系统内存使用情况。free -h (人类可读格式), vmstat 2 5 (每2秒采样一次,共5次)。

  4. iostat / iotop: 监控磁盘I/O活动。iostat -dx 2, iotop (需权限,实时查看进程I/O)。

  5. netstat / ss: 显示网络连接、路由表、接口统计等信息。ss是更现代、更快的替代品。

    • netstat -tulpn / ss -tulpn (查看监听端口及对应进程)
    • netstat -s / ss -s (显示网络统计摘要)

八、 压缩归档与传输 (处理历史日志)

  1. gzip / gunzip / zcat: 压缩/解压.gz文件。zcat可直接查看压缩文本文件内容。zcat access.log.1.gz | grep "404"

  2. bzip2 / bunzip2 / bzcat: 类似gzip,压缩率通常更高(速度慢)。bzcat error.log.bz2 | less

  3. xz / unxz / xzcat: 高压缩率工具。xzcat huge_log.xz | head

  4. tar: 归档工具。常与压缩命令组合使用。

    • tar -czvf logs.tar.gz /path/to/logs/ (创建gzip压缩的tar包)

    • tar -xzvf logs.tar.gz (解压gzip压缩的tar包)

    • tar -tf logs.tar.gz (列出tar包内容)

  5. scp / rsync: 安全复制文件/目录到远程主机或从远程主机复制。集中收集日志进行分析。rsync -avz /var/log/app/ user@backupserver:/backups/

这50个命令(及相关组合和工具)构成了Linux日志分析的核心技能栈。从快速定位日志文件(find, locate),到基础查看(less, tail, head),再到强大的文本处理三剑客(grep, sed, awk)进行过滤、提取、转换,利用sort | uniq -cjq进行统计汇总,最后通过tail -fjournalctl -fmultitail实现实时监控,结合系统状态命令(top, ps, netstat/ss)提供上下文,辅以压缩归档工具(tar, gzip)处理历史数据。熟练掌握这些命令及其适用场景,将使你能够从容应对各种日志分析挑战,高效地完成故障排查、性能分析和安全审计任务。

你可能感兴趣的:(linux,数据库,mysql)