原创 数安智信 [运维网工](javascript:void(0) 2025年07月20日 09:40 重庆
https://mp.weixin.qq.com/s/L5fZoxoIr4SLdFU7ouSy7g
在Linux系统的运维、开发和故障排查中,日志分析是至关重要的环节。面对海量、分散的日志文件,熟练掌握命令行工具是高效定位问题、发现异常、进行监控和审计的基础。本文系统性地梳理了从日志收集、基础查看、文本处理、统计汇总到实时监控和异常检测全流程中不可或缺的50个Linux命令。掌握它们,你将拥有驾驭日志的“瑞士军刀”。
一、 日志收集与定位
find
: 强大的文件搜索工具。按名称、类型、大小、时间戳等属性递归查找日志文件。例如:find /var/log -name "*.log" -mtime -1
(查找/var/log下24小时内修改过的.log文件)。locate
/ mlocate
: 利用预建数据库快速查找文件路径。适合已知部分文件名时快速定位日志位置(需先运行updatedb
更新数据库)。locate syslog
。which
: 显示给定命令的完整路径。确认日志分析工具(如grep
, awk
)的位置。which grep
。whereis
: 查找命令的二进制文件、源代码和手册页位置。比which
信息更全面。whereis awk
。二、 基础查看与导航
cat
: 连接文件并打印到标准输出。查看小型日志文件的全部内容。cat /var/log/messages
。 (警告:切勿用于大文件!)tac
: 逆序打印文件内容。查看日志结尾(最新内容)时有用。tac /var/log/syslog | head -n 20
。head
: 显示文件开头部分内容。默认显示前10行。head -n 100 /var/log/nginx/access.log
(查看前100行)。tail
: 显示文件结尾部分内容。默认显示最后10行。tail -n 50 /var/log/auth.log
(查看最后50行)。less
: 功能强大的分页阅读器。支持大文件浏览、搜索(/
)、跳转(G
/g
)、反向搜索(?
)、过滤(&
模式)等。查看日志的首选。less /var/log/kern.log
。more
: 基础的分页阅读器(功能弱于less
)。按空格翻页,Enter下一行。more /var/log/dpkg.log
。nl
: 在输出的每行前添加行号。便于定位特定行。nl application.log | less
。file
: 确定文件类型。确认日志是文本文件、压缩文件还是其他格式。file /var/log/lastlog
。三、 核心文本处理与过滤
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
递归搜索目录)egrep
: 等同于grep -E
,使用扩展正则表达式(ERE)。
fgrep
/ grep -F
: 固定字符串搜索,不解析正则元字符,速度快。
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)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
创建备份)cut
: 按列(字段)提取文本。
cut -d' ' -f1,5 access.log
(-d
指定分隔符空格, -f
指定提取第1和第5个字段)cut -c1-10 timestamp.log
(-c
按字符位置提取第1到10个字符)paste
: 水平合并多个文件的行。paste file1 file2
。
join
: 基于共同字段合并两个已排序文件的行。join file1 file2
。
sort
: 对文本行进行排序。
sort access.log
(默认按整行升序)sort -n -k 3 data.log
(-n
按数值排序, -k 3
指定按第3个字段)sort -r -u error_codes.log
(-r
降序, -u
去重)uniq
: 报告或忽略重复的行。通常与sort
连用,因为uniq
只检测连续的重复行。
- • `sort app.log | uniq -c` (`-c`在每行前显示重复次数)
- • `sort app.log | uniq -d` (`-d`只显示重复的行)
- • `sort app.log | uniq -u` (`-u`只显示唯一的行)
tr
: 字符转换或删除工具。
tr '[:lower:]' '[:upper:]' < logfile
(小写转大写)tr -d '\r' < windows.log > unix.log
(删除Windows换行符\r
)tr -s ' ' < logfile
(-s
压缩连续重复字符为单个空格)wc
: 统计文件的行数、单词数、字节数。
wc -l access.log
(-l
统计行数)wc -c largefile.log
(-c
统计字节数)wc -w report.txt
(-w
统计单词数)diff
: 比较两个文件的差异。分析配置文件变更或不同时间点的日志差异。diff config-old.conf config-new.conf
。
comm
: 逐行比较两个已排序文件,输出三列:只存在file1的行、只存在file2的行、共有的行。comm -12 file1 file2
(仅显示共有的行)。
column
: 将输入格式化为整齐的列。美化ps
、mount
等命令的输出或特定格式的日志。ps aux | column -t
(-t
自动识别分隔符并制表)。
四、 统计、汇总与格式转换
awk
(再次强调): 强大的统计和报表生成能力(如上面统计ERROR次数的例子)。
sort | uniq -c
(组合): 统计元素出现频率的经典组合。cut -d' ' -f1 access.log | sort | uniq -c | sort -nr
(统计访问IP频率并降序排列)。
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
(计算最大响应时间) (需安装)xmlstarlet
: 强大的XML命令行工具包。处理XML格式的日志或配置文件。xmlstarlet sel -t -v "//error/message" errors.xml
(需安装)。
csvkit
(工具集): 包含csvlook
, csvcut
, csvgrep
, csvstat
等,专门处理CSV格式数据。分析结构化日志或导出数据时非常有用。csvcut -c date,status access.csv | csvstat
(需安装)。
五、 实时监控与跟踪
tail -f
/ tail -F
: 实时追踪文件末尾新增内容。监控日志滚动的标准方法。tail -f /var/log/apache2/error.log
(持续输出新增行)tail -F /var/log/app/*.log
(-F
比-f
更健壮,跟踪文件名变化(如日志轮转))less +F
: 在less
中进入类似tail -f
的实时跟踪模式(按Ctrl+C
退出跟踪,F
重新进入)。
multitail
: 高级工具,可在一个终端窗口同时监控多个文件,支持颜色高亮、过滤等。监控多个相关日志流的绝佳选择。multitail -i /var/log/nginx/access.log -i /var/log/nginx/error.log
(需安装)。
watch
: 定期重复执行指定命令并全屏输出结果。监控动态变化。
watch -n 2 "netstat -tulpn | grep :80"
(每2秒刷新一次监控80端口连接)watch -d 'grep "CPU" /proc/stat'
(-d
高亮显示变化部分)dmesg
: 查看和控制内核环形缓冲区。诊断硬件错误、驱动问题、系统启动早期信息。dmesg | grep -i error
, dmesg -T
(显示可读时间戳), dmesg -w
(实时监控新消息)。
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
(查看日志占用的磁盘空间)六、 文件与内容操作
touch
: 更改文件时间戳或创建空文件。有时用于标记日志分析状态或创建占位文件。touch analysis_complete.flag
。
mkdir
: 创建目录。组织日志分析工作空间。mkdir logs_analysis && cd $_
。
cp
/ mv
: 复制/移动文件或目录。备份日志或整理文件。cp critical.log{,.bak}
, mv old_logs/ archive/
。
rm
: 删除文件或目录。慎用! 清理临时分析文件。rm *.tmp
。
ln
: 创建文件链接(硬链接或符号链接)。方便访问常用日志文件。ln -s /var/log/nginx/access.log nginx_access
。
chmod
/ chown
: 更改文件权限/所有权。有时需要调整权限才能访问日志(但应遵循最小权限原则)。sudo chmod o+r /var/log/app/protected.log
(谨慎使用!)。
tee
: 从标准输入读取并写入标准输出和文件。在管道中保存中间结果或同时输出到屏幕和文件。
grep "WARN" app.log | tee warnings.txt | less
sudo tcpdump port 80 | tee packet_capture.log
(需要权限)七、 系统状态与进程监控 (辅助上下文分析)
top
/ htop
: 实时动态查看系统进程活动及资源(CPU、内存)占用情况。htop
功能更强大、界面更友好。top
, htop
。
ps
: 报告当前进程快照。查找与日志相关的进程及其PID。
ps aux | grep java
(查找Java进程)ps -ef -p 5678
(查看PID为5678的进程详细信息)free
/ vmstat
: 查看系统内存使用情况。free -h
(人类可读格式), vmstat 2 5
(每2秒采样一次,共5次)。
iostat
/ iotop
: 监控磁盘I/O活动。iostat -dx 2
, iotop
(需权限,实时查看进程I/O)。
netstat
/ ss
: 显示网络连接、路由表、接口统计等信息。ss
是更现代、更快的替代品。
netstat -tulpn
/ ss -tulpn
(查看监听端口及对应进程)netstat -s
/ ss -s
(显示网络统计摘要)八、 压缩归档与传输 (处理历史日志)
• gzip
/ gunzip
/ zcat
: 压缩/解压.gz文件。zcat
可直接查看压缩文本文件内容。zcat access.log.1.gz | grep "404"
。
• bzip2
/ bunzip2
/ bzcat
: 类似gzip,压缩率通常更高(速度慢)。bzcat error.log.bz2 | less
。
• xz
/ unxz
/ xzcat
: 高压缩率工具。xzcat huge_log.xz | head
。
• tar
: 归档工具。常与压缩命令组合使用。
• tar -czvf logs.tar.gz /path/to/logs/
(创建gzip压缩的tar包)
• tar -xzvf logs.tar.gz
(解压gzip压缩的tar包)
• tar -tf logs.tar.gz
(列出tar包内容)
• scp
/ rsync
: 安全复制文件/目录到远程主机或从远程主机复制。集中收集日志进行分析。rsync -avz /var/log/app/ user@backupserver:/backups/
。
这50个命令(及相关组合和工具)构成了Linux日志分析的核心技能栈。从快速定位日志文件(find
, locate
),到基础查看(less
, tail
, head
),再到强大的文本处理三剑客(grep
, sed
, awk
)进行过滤、提取、转换,利用sort | uniq -c
、jq
进行统计汇总,最后通过tail -f
、journalctl -f
、multitail
实现实时监控,结合系统状态命令(top
, ps
, netstat/ss
)提供上下文,辅以压缩归档工具(tar
, gzip
)处理历史数据。熟练掌握这些命令及其适用场景,将使你能够从容应对各种日志分析挑战,高效地完成故障排查、性能分析和安全审计任务。