使用grep / sed提取String的一部分

时间:2013-10-08 08:25:08

标签: regex sed grep

我在linux中有一个文件,其中包含类似的条目,如下所示

dn: CN=HP_NetworkSupport,OU=groups,DC=HDFCSLDM,DC=COM
dn: CN=Review users,OU=groups,DC=HDFCSLDM,DC=COM

我想只提取CN信息,直到第一个, 例如:

> HP_NetworkSupport
> Review users

在上述情况下到另一个文件。

做同样的事情将会是什么命令。

5 个答案:

答案 0 :(得分:15)

这是使用lookahead的一种方式:

grep -Po '(?<=CN=)[^,]*' file > new_file

它会从CN=(未包含)中获取所有文本,直到找到逗号,[^,]*的想法是获取任何不是逗号的字符。

测试

$ grep -Po '(?<=CN=)[^,]*' file
HP_NetworkSupport
Review users

答案 1 :(得分:4)

使用awk

awk -F"=|," '{print $2}' file
HP_NetworkSupport
Review users

awk -F[=,] '{print $2}' file
HP_NetworkSupport
Review users

将分隔符设置为,=,然后打印第二个字段。


对于带逗号的handel字段,你应该使用LDAP的解析器,但这应该有效。

echo file
dn: CN=HP_NetworkSupport,OU=groups,DC=HDFCSLDM,DC=COM
dn: CN="Review, users",OU=groups,DC=HDFCSLDM,DC=COM

awk -F"CN=|,OU" '{print $2}' file
HP_NetworkSupport
Review, users

答案 2 :(得分:2)

使用sed

$ sed -r 's/.*CN=([^,]*),.*/\1/' inputfile
HP_NetworkSupport
Review users

答案 3 :(得分:2)

perl -lne 'print $1 if(/CN=([^\,]*),/)' your_file

下面测试:

> cat temp
dn: CN=HP_NetworkSupport,OU=groups,DC=HDFCSLDM,DC=COM
dn: CN=Review users,OU=groups,DC=HDFCSLDM,DC=COM
> perl -lne 'print $1 if(/CN=([^\,]*),/)' temp
HP_NetworkSupport
Review users
>

答案 4 :(得分:-1)

通过此命令管道:

sed -E "s/.*CN=(.+?),OU=.*/\\1/g"