grep命令中-z与-Z参数区别及-z输出0a而非00问题咨询
核心原因:-z和-Z的管辖范围完全不同
你测试时使用的grep -rlz命令加了-l参数,这个参数的作用是输出匹配到的文件名列表,文件名列表的分隔符规则由-Z参数控制,和-z没有关系,所以你看到输出的文件名末尾是默认的换行符0a。
两个参数的分工明确
-Z(--null)
专门负责文件名输出场景的分隔符:只要grep的输出内容是文件名列表(比如搭配-l/-L输出匹配/不匹配的文件名),就会把默认的文件名分隔符换行(0a)替换为NUL零字节(00),和你测试的grep -rlZ结果一致。-z(--null-data)
只负责文件内容的行分隔逻辑,手册中提到的output指的是「输出文件内匹配到的内容行」的场景,不涉及文件名输出:
- 读取文件内容时,把NUL零字节当做行结束符,而不是默认的换行符
- 输出匹配到的文件内容行时,把行尾的换行符替换为NUL零字节
你可以用下面的测试验证-z的output效果:
# 构造用NUL分隔内容的测试输入 echo -e "line1\0line2\0line3" | grep -z "line1" | xxd
输出结果里line1后面跟的就是00而非0a,符合手册描述。
你之前的测试中-z只影响了grep读取/tmp/target/it is a test.txt内容时的行分隔规则,不影响最终输出的文件名列表的分隔符,所以才会出现你看到的结果。
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

