admin 管理员组

文章数量: 1086250

Linux-系统日志查询命令详解

一、tail & head

tail主要用于显示文件的末尾内容。

  1. 将每个FILE的最后10行打印到标准输出。

  2. 如果有多个文件,在每个文件之前加上一个头文件,给出文件名。

  3. 如果没有FILE,或者当FILE为-时,读取标准输入。

1、格式: tail [选项] [文件名]

2、常用参数:

【最常用】 -f, --follow[={name|descriptor}]:实时监控文件的新增内容。使用该参数后,tail会持续显示文件的末尾内容,并在有新内容时自动刷新显示。

-n, --lines=num:指定显示文件的最后num行,默认值是10。【和-f配合使用】

-c, --bytes=K 输出最后K个字节; 或者使用-c +K输出从每个文件的第k个字节开始

-q, --quiet, --silent 从不输出给出文件名的首部

-v,--verbose总是输出带有文件名的头文件

–pid=PID:与-f参数结合使用,指定监控指定进程ID的文件。在进程ID,PID死掉之后结束

-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

--help:显示帮助信息。

--version:显示版本信息。

3、栗子:

#1. 显示文件的末尾几行内容(默认10行):
tail filename
#2. 显示文件的末尾20行内容:
tail -n 20 filename
#3. 实时监控文件的新增内容:
tail -f filename
#4. 显示文件的最后500个字节的内容:
tail -c 500 filename
#5. 不显示文件名:
tail -q filename
#6. 实时监控文件新增内容且限制末尾行数
tail -200f filename
#7. -f配合grep使用
tail -f info.log | grep  "orderId":动态查看含有关键字orderId的日志
tail -100f xxx.log | grep '2022-05-23 18:1[0-9]'    ------查找最新的100行中时间范围在2022-05-23 16:10-2022-05-23 16:19范围中的行

4、系统描述:

head用于显示文件的开头部分

其他参数基本和tail一样,用到的相对少点。

head -n -10 test.log 查询日志文件除了最后10行的其他所有日志;

二、vim

1、日志查找用法

1、关键词搜索
/关键词     " 正向搜索(n跳下一个,N上一个)
?关键词     " 反向搜索
​
# 查询中
# 启用高亮::set hlsearch
# 取消高亮::nohlsearch(简写 :noh)

2、vim编辑器用法(基本用法)

三、grep

1、基础查询

grep "关键词" 日志文件.log       # 基本搜索(区分大小写)
grep -i "error" 日志文件.log        # 忽略大小写,搜索error相关字段
grep -w "timeout" 日志文件.log      # 精确匹配单词(避免匹配partial),搜索timeout相关字段
grep -n "404" 日志文件.log       # 显示行号,搜索404相关字段
grep -v "DEBUG" 日志文件.log        # 反向搜索(排除DEBUG行)

2、多文件与递归搜索

grep "OOM" /var/log/*.log      # 搜索目录下所有.log文件
grep -r "Connection refused" /var/log/  # 递归搜索目录
grep -l "segfault" /var/log/*  # 只显示包含匹配项的文件名

3、上下文查看(Before/After)

grep -A 3 "Exception" app.log   # 显示匹配行及其后3行(After)
grep -B 2 "WARN" app.log        # 显示匹配行及前2行(Before)
grep -C 1 "ERROR" app.log       # 显示匹配行前后各1行(Context)

4、正则表达式搜索

grep -E "50[0-9]" access.log    # 匹配500-599状态码(扩展正则)
grep "^2023-10" app.log         # 匹配以日期开头的行
grep "shutdown\|reboot" syslog  # 匹配shutdown或reboot
grep -P "\d{2}:\d{2}:\d{2}"     # Perl风格正则(需-P参数) todo未知作用

5、范围过滤

# 结合sed过滤时间范围,要求日志中时间打印格式和搜索关键词匹配
sed -n '/2025-04-01 09:00/,/2025-04-01 10:00/p' app.log | grep "ERROR"
​
# 使用awk精确过滤时间戳
awk '/2023-10-01 09:00:/,/2023-10-01 10:00:/' app.log | grep "CRITICAL"

六、组合其他命令

  1. 高频错误统计

    grep -o "ERROR .*" app.log | sort | uniq -c | sort -nr
  2. 实时日志监控

    tail -f app.log | grep——line-buffered “ERROR”
  3. 多条件过滤

    grep -v “预期错误”

7、性能优化技巧

grep -m 100 "panic" app.log      # 只显示前100个匹配项(大文件时提速)
grep --color=always "404" | less -R  # 高亮结果并分页
zgrep "OOM" /var/log/syslog*.gz # 直接搜索压缩日志

八、实用场景示例

  1. 查询Nginx访问日志

    grep "GET /api" access.log | awk '{print $1,$7,$9}'  # 提取IP、路径、状态码
  2. 分析Java异常堆栈

    grep -A 10 "Caused by:" app.log  # 显示异常堆栈上下文
  3. 监控Kubernetes日志

    kubectl logs -f pod-name | grep -E “ERROR|WARN”

四、cat、more、sed、less

1、cat

# 输入内容后按 Ctrl   D 保存退出。
cat > newfile
# 合并多个文件内容到一个新文件
cat file1 file2 > mergedfile
# 追加文件内容到另一个文件
cat file1 >> file2
# 显示行号
cat -n filename
# 显示非空白的行号
cat -b filename
# 清空文件内容
cat /dev
ull > filename

和管道符号结合使用

# 从文件中过滤出包含keyword的行
cat file | grep "keywork"

注意事项

cat命令一次性输出全部内容,不适合查看超大文件

2、more

逐页显示文件内容,适合查看大文件

1基础用法
more [选项] filename
选项说明
-d显示提示信息(如按空格翻页,按 q 退出)
-f强制显示长行(不自动换行)
-p不滚屏,直接清屏显示下一页
-c不滚屏,从上到下绘制新内容
-s将连续的空行压缩为一行
+n从第 n 行开始显示(如 more +10 file
+/pattern从匹配 pattern 的第一行开始显示
2搜索并跳转到匹配行
more /queryString文件名
3结合管道
# 前面命令执行结果分页展示
ls -l /etc | more

3、sed

流式文本编辑器,主要用于对文本进行查找、替换、删除、插入等操作,支持正则表达式,适合批量处理文本或自动化脚本。

1基本语法
set [选项] '命令' filename
cat 文件 | sed '命令'
选项说明
-n只显示处理后的行(默认 sed 会输出所有行)
-i直接修改文件(慎用!建议先不加 -i 测试)
-e指定多个命令(如 sed -e '命令1' -e '命令2'
-f从脚本文件读取 sed 命令
-r使用扩展正则表达式(类似 grep -E
2常用功能

1、替换文本: /s/pattern/replacement/flags

sed 's/old
ew/' file.txt        # 每行第一个 "old" 替换为 "new"
sed 's/old
ew/g' file.txt       # 替换所有匹配的 "old"(全局替换)
sed 's/old
ew/2' file.txt       # 只替换每行第二个 "old"
sed 's/old
ew/ig' file.txt      # 忽略大小写(i flag)并全局替换(g flag)
# 实例:
echo "hello world" | sed 's/hello/hi/'    # 输出:hi world

2、删除行:d

sed '3d' file.txt           # 删除第 3 行
sed '1,5d' file.txt         # 删除 1~5 行
sed '/pattern/d' file.txt   # 删除匹配 "pattern" 的行
sed '/^$/d' file.txt        # 删除所有空行
# 实例:
seq 10 | sed '3,6d'  # 输出 1 2 7 8 9 10(删除 3~6 行)

3、打印行:p

sed -n '3p' file.txt        # 只打印第 3 行
sed -n '1,5p' file.txt      # 打印 1~5 行
sed -n '/pattern/p' file.txt # 打印匹配 "pattern" 的行
# 实例:
sed -n '/error/p' log.txt  # 打印所有含 "error" 的行

4、插入、追加、修改行

sed '3i\插入的内容' file.txt    # 在第 3 行**前**插入一行
sed '3a\追加的内容' file.txt    # 在第 3 行**后**追加一行
sed '$a\最后一行追加' file.txt  # 在文件末尾追加一行
# 实例:
sed '2i\### 这是新插入的行 ###' file.txt

==========
sed '/pattern/c\新内容' file.txt  # 匹配的行替换为新内容
sed '5c\这是新的第5行' file.txt   # 修改第 5 行
# 实例:
sed '/admin/c\### 权限已变更 ###' users.txt
===========
sed '=' file.txt           # 显示行号(行号单独占一行)
sed -n '=;p' file.txt      # 显示行号   内容(需结合 `-n` 和 `p`)
sed -n '10,20p' file.txt   # 打印 10~20 行
3、高级用法
# 正则表达式
sed 's/[0-9]\ /NUM/g' file.txt   # 所有数字替换为 "NUM"
sed 's/^#.*//' file.txt          # 删除所有注释行(以 # 开头)
sed '/^$/d' file.txt             # 删除空行
============
# 引用匹配内容(& 和 \1, \2)
echo "123 abc" | sed 's/[0-9]\ /& &/'  # 输出:123 123 abc
echo "hello 123" | sed 's/\([a-z]\ \) \([0-9]\ \)/\2 \1/'  # 输出:123 hello
============
# 多命令组合
sed -e 's/foo/bar/' -e '/baz/d' file.txt  # 先替换,再删除含 "baz" 的行
sed 's/foo/bar/; /baz/d' file.txt
============
# 直接修改文件
sed -i 's/old
ew/g' file.txt      # 直接修改文件(谨慎使用!)
sed -i.bak 's/old
ew/g' file.txt  # 修改前备份原文件(生成 file.txt.bak)

实例:

# 批量替换文件内容
sed -i 's/Windows/Linux/g' *.txt   # 当前目录所有 .txt 文件中的 "Windows" 替换为 "Linux"
# 提取 IP 地址
ifconfig | sed -n '/inet /p' | sed 's/.*inet \([0-9.]\ \).*/\1/'

注意事项:

  1. 先测试再修改:用 sed '命令' file.txt 预览结果,确认无误后再加 -i

  2. 正则表达式特殊字符(如 .*[]^$)需要转义。

  3. sed 默认不修改原文件,除非使用 -i

4、less

分页文件查看工具,相比 morecat,它支持前后翻页、搜索、高亮、跳转等功能,特别适合查看大文件(如日志、配置文件等)。

1. 基本语法
less [选项] 文件名
command | less
选项说明
-N显示行号
-i搜索时忽略大小写
-F如果文件可一屏显示,则直接输出(类似 cat
-S禁止自动换行(长行需用 键横向滚动)
-X退出时不清理屏幕(保留 less 的输出)
-R显示 ANSI 颜色转义字符(适合查看彩色日志)
+/pattern打开文件后直接跳转到匹配 pattern 的第一个位置
2. 交互式操作(快捷键)**

(1)基本导航

快捷键功能
空格f向下翻一页
回车键或↓向下翻一行
bPage Up向上翻一页
u或下一页向上翻半页
d或下一页向下翻半页
g / Home跳到文件开头
G、结束跳到文件末尾
50%跳转到文件的 50% 位置
10克跳转到第 10 行

(2)搜索功能

快捷键功能
/模式向下搜索 pattern(正则表达式支持)
模式吗?向上搜索 pattern
n跳到下一个匹配项
N跳到上一个匹配项
模式仅显示匹配 pattern 的行(类似 grep

(3)文件操作

快捷键功能
:n切换到下一个文件(打开多个文件时)
:p切换到上一个文件
v进入 vi 编辑器(编辑当前文件)
h显示帮助
退出 less

(4)标记位置

快捷键功能
m + 字母标记当前位置(如 ma 标记为 a
' + 字母跳转到标记位置(如 'a 跳回 a 标记)
3. 常见用法示例
# 查看文件并显示行号
less -N /var/log/syslog
# 搜索日志中的错误,进入 less后输入 `/error` 查找所有 `error` 关键字
less /var/log
ginx/error.log
#查看命令输出(分页显示)
ls -l /etc | less
# 打开文件后直接跳转到匹配行
less  /error /var/log/syslog
# 禁止换行(适合查看长行日志),用 `→` 或 `←` 键横向滚动。
less -S /var/log/dmesg
# 保留颜色输出(如 `grep --color` 的结果)
grep --color "ERROR" /var/log/syslog | less -R
4高级用法
# 结合 tail -f 实时查看日志
tail -f /var/log
ginx/access.log | less
# 按 F 进入 Follow Mode(类似 tail -f),Ctrl C 退出。
=============
# 只查看匹配的行
less -p "error" filename
#相当于 grep "error" /var/log/syslog | less

五、两个巨好用的xargs 和 awk工具

1、xargs 用法详解

xargs 是 Linux 中一个非常强大的命令,用于从标准输入构建并执行命令行。它通常与其他命令(如 findgrep 等)结合使用,以处理大量数据或文件。xargs 的核心功能是将输入数据转换为命令行参数。

1. 基础功能
  • 输入xargs 从标准输入(stdin)读取数据。

  • 输出:将输入数据作为参数传递给指定的命令并执行。

# 查找文件并删除
find . -name "*.tmp" | xargs rm -f

# 多行输入转单行(默认用空格分隔)
cat urls.txt | xargs
2. 参数用法
选项说明
-n指定每次执行命令时使用的参数个数。
-I用输入项替换占位符(通常为 {})。
-p交互式模式,执行前提示用户确认。
-t打印执行的命令。
-r如果输入为空,则不执行命令。
-d指定输入的分隔符(默认是空格和换行)。
-a从文件读取输入,而不是标准输入。
-L指定每次执行命令时使用的行数。
-s设置命令行的最大长度。
--max-procs并行执行命令,指定最大进程数。
3.使用事例
# 批量重命名文件
ls *.jpg | xargs -I {} mv {} prefix_{}

# 并行压缩文件
find . -name "*.log" | xargs -P 4 -I {} gzip {}

# 结合grep搜索多个文件
find /var/log -type f | xargs grep -l "ERROR"

示例 1:基本用法

将输入作为参数传递给 echo 命令:

Echo "file1 file2 file3" | xargs Echo

输出:

File1 file2 file3

示例 2:结合 find 使用

查找当前目录下的 .txt 文件并删除:

找到。-name "*.txt" | xargs rm

示例 3:限制每次执行的参数个数(-n

每次只传递 2 个参数给 echo

Echo "1 2 3 4 5" | xargs -n 2 Echo

输出:

1 2
3 4
5

示例 4:使用占位符(-I

将输入项替换为占位符 {}

echo "file1 file2 file3" | xargs -I {} cp {} /backup/

这会将 file1file2file3 分别复制到 /backup/ 目录。

示例 5:交互式模式(-p

在执行命令前提示用户确认:

回显“file1 file2 file3” | xargs -p rm

输出:

Rm file1 file2 file3 ?

输入 y 确认执行。

示例 6:打印执行的命令(-t

在执行命令前打印命令:

回显“file1 file2 file3” | xargs -t Echo

输出:

Echo file1 file2 file3
File1 file2 file3

示例 7:忽略空输入(-r

如果输入为空,则不执行命令:

-r echo “No input”

(无输出)

示例 8:指定输入分隔符(-d

使用逗号作为分隔符:

Echo "file1,file2,file3" | xargs -d, Echo

输出:

File1 file2 file3

示例 9:从文件读取输入(-a

从文件 input.txt 读取输入:

Xargs - input.txt回显

示例 10:并行执行命令(--max-procs

并行执行命令,最多同时运行 2 个进程:

回显“1 2 3 4 5”| xargs -n 1——max-procs=2 sleep

这会同时运行 2 个 sleep 进程。

4. 高级用法

结合 findxargs 处理文件名中的空格

如果文件名中包含空格,可以使用 find-print0xargs-0 选项:

找到。-name "*.txt" -print0 | xargs -0 rm

批量重命名文件

将当前目录下的 .txt 文件重命名为 .bak

找到。-name "*.txt" | xargs -I {} mv {} {}.bak

并行压缩文件

使用 xargsgzip 并行压缩文件:

找到。-name "*.log" | xargs -n 1——max-procs=4 gzip .log
5. 注意事项
  1. 输入数据量xargs 默认会将所有输入数据作为参数传递给命令,如果数据量过大,可能会导致命令行过长。可以使用 -n-L 选项限制参数个数。

  2. 文件名中的特殊字符:如果文件名中包含空格或特殊字符,建议使用 find -print0xargs -0

  3. 安全性:在处理用户输入时,需谨慎使用 xargs,避免命令注入风险。

参考:xargs命令详解 - dashery - 博客园

本文标签: 详解 命令 常用 日志 vim