如何使用 grep 从行中提取特定字段值

Sto*_*dow 5 grep

我在文件中有如下几行

....... DisplayName="john" ..........
Run Code Online (Sandbox Code Playgroud)

其中....表示其他字段的可变数量。

使用以下 grep 命令,我能够提取具有有效“DisplayName”字段的所有行:

grep DisplayName="[0-9A-Za-z[:space:]]*" e:\test
Run Code Online (Sandbox Code Playgroud)

但是,我希望只从每一行中提取名称(即“john”),而不是从 grep 返回的整行中提取。我尝试将输出通过管道传输到cut命令中,但它不接受字符串分隔符。

Mik*_*e T 5

这对我有用:

awk -F "=" '/DisplayName/ {print $2}'
Run Code Online (Sandbox Code Playgroud)

返回"john". 要删除要john使用的引号:

awk -F "=" '/DisplayName/ {gsub("\"","");print $2}'
Run Code Online (Sandbox Code Playgroud)


Mel*_*ior 4

具体来说:

sed 's/.*DisplayName="\(.*\)".*/\1/' 
Run Code Online (Sandbox Code Playgroud)

应该这样做,sed 语义是 s/subsitutethis/forthis/ 其中“/”是分隔符。转义括号与转义 1 组合用于保留括号指定的模式部分。该表达式将显示名称后面的所有内容保留在括号内,并丢弃其余部分。

如果您使用以下命令,则无需先使用 grep 也可以工作:

sed -n 's/.*DisplayName="\(.*\)".*/\1/p'
Run Code Online (Sandbox Code Playgroud)

-n 选项和 p 标志告诉 sed 仅打印更改的行。

更多信息: http: //www.grymoire.com/Unix/Sed.html