journalctl默认输出二进制日志,需用-o指定文本格式(如short)再grep;但优先使用其内置字段过滤(如_COMM=sshd)更高效准确;复杂处理推荐-o json配合jq。

在 Linux 中,journalctl 默认输出的是 systemd 的二进制日志,不能直接用 grep 做文本匹配——因为日志不是纯文本流,而是结构化数据。必须先让 journalctl 输出为可读的文本格式,再通过管道交给 grep 过滤。
用 -o short 或 -o json 格式输出再 grep
journalctl 的 -o(--output)选项控制输出格式。最常用的是 -o short(默认格式,人类可读),适合配合 grep 查关键词:
-
journalctl -o short | grep "sshd"—— 查含 “sshd” 的所有日志行 -
journalctl -o short -u nginx | grep "error"—— 查 nginx 单元中带 “error” 的日志
注意:-o short 输出包含时间、主机、服务名、PID、消息等字段,grep 会匹配任意位置(比如时间戳里有 “error” 也会被误中)。如需更精准,推荐用 -o json + jq(见下文),或用 journalctl 原生过滤代替。
优先用 journalctl 内置过滤,比 grep 更高效准确
journalctl 自带字段级过滤能力,比外部 grep 更可靠、不依赖文本格式,还能利用索引加速:
-
journalctl _COMM=sshd—— 只查 sshd 进程产生的日志(按命令名) -
journalctl SYSLOG_IDENTIFIER=nginx—— 按日志标识符过滤(常用于 syslog 兼容服务) -
journalctl MESSAGE="connection refused"—— 精确匹配消息内容(注意:支持通配符*,但大小写敏感) -
journalctl PRIORITY=3—— 查错误级别(3=ERR,2=CRIT,1=ALERT,0=EMERG)
多个条件可组合:journalctl _COMM=python MESSAGE=*timeout* PRIORITY=3
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
需要复杂文本处理时:用 -o json + jq 替代 grep
若要提取特定字段、做正则、忽略大小写、或避免时间戳干扰,-o json 是更健壮的选择:
-
journalctl -o json -u docker | jq -r 'select(.MESSAGE | contains("failed")) | .MESSAGE'—— 提取含 “failed” 的 MESSAGE 字段 -
journalctl -o json --since "1 hour ago" | jq -r 'select(.SYSLOG_IDENTIFIER=="kernel") | .MESSAGE'—— 查 1 小时内 kernel 日志的消息体
jq 支持大小写无关匹配:test("fail"; "i"),也支持正则和嵌套字段访问,远强于 grep 的简单字符串扫描。
小技巧:实时过滤 + 高亮关键词
结合 journalctl -f 实时跟踪,并用 grep --color=always 高亮关键词:
-
journalctl -f -o short | grep --color=always -i "warning\|error"—— 实时滚动并高亮 warning/error(-i忽略大小写) - 加
less -R可翻页:journalctl -o short | grep -i "oom" | less -R
注意:journalctl -f 是阻塞式流,管道后无法用 less 回溯,仅适合盯屏;历史日志建议先重定向或用 less 分页查看。

















