Linux中如何提取CN=与逗号之间的目标字符串?
问题分析
你之前用的sed -n "/CN=/,/,/p"命令逻辑不对——它是匹配包含CN=的行到包含逗号的行并打印,不是提取两个标记之间的子串,所以拿不到想要的结果。
正确解决方法
这里提供几种实用的命令行工具实现方式:
1. 使用sed(最通用)
通过正则替换过滤掉无关内容,只保留CN=到第一个逗号之间的部分:
sed 's/.*CN=\([^,]*\),.*/\1/' test.txt
原理:
.*CN=匹配CN=之前的所有字符\([^,]*\)捕获CN=后到第一个逗号前的所有非逗号字符(目标内容).*匹配逗号之后的所有字符- 用
\1替换整行,只保留捕获的目标内容
2. 使用awk
以逗号为分隔符拆分字段,定位到含CN=的字段后提取内容:
awk -F ',' '{for(i=1;i<=NF;i++){if($i~/CN=/){sub(/CN=/,"",$i);print $i}}}' test.txt
原理:
-F ','把每行按逗号拆分成多个字段- 遍历所有字段,找到包含
CN=的字段 - 用
sub去掉字段里的CN=前缀,打印剩余内容
3. 使用grep(需支持Perl正则)
如果你的grep支持-P参数(多数Linux发行版默认支持),可以用更简洁的写法:
grep -oP 'CN=\K[^,]*' test.txt
原理:
-o只输出匹配到的部分,不输出整行-P启用Perl兼容正则\K忽略前面匹配到的CN=,只保留后面到第一个逗号前的非逗号字符
以上三种命令执行后,都会输出预期结果:
abc.def.com
内容的提问来源于stack exchange,提问作者Raj87
相关产品推荐
相关产品推荐

