使用grep/sed提取字符串的一部分

问题描述 投票:0回答:6

我在 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

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

执行同样操作的命令是什么?

regex sed grep
6个回答
20
投票

这是 lookahead 的一种方式:

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

它从

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

测试

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

6
投票

使用

awk

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

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

将分隔符设置为

,
=
,然后打印第二个字段。


要处理其中包含逗号的字段,您应该使用 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
投票

使用

sed

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

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
>

0
投票
grep -o 'CN=[^,]*' data | sed 's/^CN=//'

-2
投票

通过此命令进行管道传输:

sed -E "s/.*CN=(.+?),OU=.*/\\1/g"
© www.soinside.com 2019 - 2024. All rights reserved.