Linux系统使用awk、tail、grep、sed搜索文件内容

一个大文件,如果用cat命令打印,则根本无从下手。这时需要使用awk、tail、grep、sed等命令,只查找关键的数据。


tail查看最新输出

-f (follow):实时追加显示文件尾部内容

tail -f XXX

只看最后 200行,并保持实时刷新,避免被历史日志干扰

tail -n 20 -f XXX


less按需加载

less XXX

进入界面后的操作流:

Shift + G 先跳到日志最末尾(因为报错通常发生在最近)。

?XXX 输入问号+要查找的字符串,向上反向搜索。

n:如果当前这行不是关键信息,按 n 继续向上找上一次出现的位置。

Shift + F 如果看着看着,日志又更新了,按这个组合键可以让 less 进入类似 tail -f 的实时滚动模式;按 Ctrl + C 退回浏览模式。


grep搜索文件行

搜索异常关键字,并显示该行 "前后各 20 行"

grep -C 20 "XXX" 文件名

-c (count):只统计匹配的行数

grep -c "XXX" 文件名

搜索当前目录下所有以 log 开头的文件

grep "XXX" log*

-v (invert):显示不包含 "Haha" 的所有行

grep -v "Haha"


sed截取行

语法:sed -n '/开始时间/,/结束时间/p' 源文件 > 目标文件

注意:时间格式必须和日志里的格式完全一致

p 打印模板块的行。

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行

sed -n '/^2025/,/^2026/p' application.log > error_segment.log


awk提取列

我们有时需要分析 Nginx 日志,找出访问量最高的 IP。

1. awk '{print $1}':提取第一列IP

2. sort:排序,把相同的 IP 排在一起

3. uniq -c:去重并统计每个 IP 出现的次数

4. sort -nr:按次数(n)倒序(r)排列

5. head -n 10:取前 10 名

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

Nginx 日志中通常记录了响应时间,假设在最后一列,我们想把响应时间超过 1 秒的请求找出来。

$NF 一行的总字段数,代表最后一列

打印所有响应时间大于 1 秒的 URL(假设 URL 在第 7 列)

awk 'NF \> 1.000 {print 7, $NF}' access.log

相关推荐
aningx9 分钟前
cachyos 从 GRUB 切换到 rEFInd
linux
第404号工位2 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
骑着蜗牛撵大象3273 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
..Dauntless..4 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
QMCY_jason4 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器
重生之小比特4 小时前
【Linux系统】12 进程程序替换 自定义Shell 命令行解释器
linux·运维·服务器
あ-4 小时前
CubeSandBox配置CubeMaster CPU 超分
linux·运维·服务器
Escalating_xu4 小时前
【Linux 网络编程】TCP Socket 编程(上):从 listen、accept 到完整回显通信
linux·网络·tcp/ip
老秦包你会4 小时前
Linux第十课---------Linux信号
linux
北风toto6 小时前
Linux 服务器如何判断 CPU 是否支持 x86-64-v2 指令集
java·linux·服务器