grep -o 仅输出匹配的子串且每行一个,便于统计和处理;配合 -c 可统计总匹配次数,-i 忽略大小写,--color=auto 高亮,-w 全词匹配防误匹配。

用 grep -o 就能只输出匹配到的关键字本身,每个匹配单独占一行,这样后续统计、去重或进一步处理都更方便。
核心选项:-o(only-matching)
添加 -o 参数后,grep 不再输出整行,而是把每处匹配的子串单独提取出来,一行一个:
-
grep -o "error" logfile.txt→ 每个error单独输出一行,哪怕同一行出现多次 -
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" access.log→ 只输出所有 IP 地址,每行一个
配合计数:直接统计匹配次数
要统计关键字总共出现了多少次(不是多少行),-o 是前提,再加 -c:
-
grep -oc "failed" auth.log→ 输出数字,比如42,表示failed共匹配了 42 次 - 注意:
grep -c单独用是统计“含匹配的行数”,而grep -oc才是统计“匹配实例总数”
处理多匹配同行的情况
如果一行里有多个目标(如多个 IP、多个时间戳),-o 会自动拆成多行输出,天然适配计数和后续分析:
- 输入行:
ips: 192.168.1.1, 10.0.0.5, 172.16.0.1 -
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" file输出三行,每行一个 IP - 再接
| wc -l或-c就得到精确匹配次数
小技巧:高亮与大小写
-o 可和其他常用选项组合:
-
grep -io "warning"→ 忽略大小写,只输出匹配词 -
grep -o --color=auto "ERROR"→ 匹配部分依然高亮(终端支持时) - 避免误匹配可加
-w(全词匹配):grep -ow "cat" text不会匹配category











