本问题已经有最佳答案,请猛点这里访问。

我有一条线:

-Dapp.id=XXX -Dapp.name=YYY -Dapp.inventory.id=KKK -Dapp.inventory1.id=UNDEFINED -app.id=MMM

在inventory.txt文件中。 如果我使用下面的grep语句,我得到整行而不是KKK:

grep -F app.inventory.id= /cme/apps/install/*/inventory/*.txt

我也尝试了像-Fx和-w这样的标志,但没有任何效果。 如何使用grep获取just KKK?

我知道这是一个糟糕的事情,但请改用sed或awk。 它可以让你控制打印哪个部分。 grep也将使用-o,但它也将包含-D...部分。

你可以使用选项:grep -o

awk -F '[= ]' '{print $6}' file

KKK

awk来救援!

$ echo -Dapp.id=XXX -Dapp.name=YYY -Dapp.inventory.id=KKK -Dapp.inventory1.id=UNDEFINED -app.id=MMM |

awk -v RS=' +' '/app.inventory.id/{split($0,a,"=");print a[2]}'

KKK

grep -Eo"\s-Dapp.inventory.id=[A-Z]+\s" inventory.txt | cut -d '=' -f2

grep的

-E使用扩展的正则表达式,

-o仅输出匹配项

[A-Z]+\s将大写字母与下一个空格匹配

要查看匹配项:

grep --color -Eo"\s-Dapp.inventory.id=[A-Z]+\s" inventory.txt

-d --delimiter =字段的DELIM分隔符,

-f --fields = LIST仅输出所选字段

我认为sed在这里有点好看:

sed -n 's/.*-Dapp.inventory.id=\([^ ]*\).*/\1/gp' /cme/apps/install/*/inventory/*.txt

如果你想要文件名,你可以做类似的事情

for filename in /cme/apps/install/*/inventory/*.txt; do

sed -n -e 's/.*-Dapp.inventory.id=\([^ ]*\).*/'$filename': \1/gp' $filename;

done

谢谢你的帮助 - 工作得很好

我得到了sed的值,是否有可能得到sed操作的文件名? 我在该路径中有多个.txt文件。 请帮帮我

我添加了一种获取文件名的方法。

谢谢你的帮助。

如果所有文件具有相同类型的输出,则意味着:

-Dapp.id=VALUE -Dapp.name=VALUE -Dapp.inventory.id=VALUE -Dapp.inventory1.id=VALUE [...]

然后你可以像这样使用awk:

grep -F app.inventory.id= /cme/apps/install/*/inventory/*.txt | awk -F ' ' '{print $3}' | awk -F '=' '{print $2}

如果您只想使用grep执行此操作,则可以使用内置PCRE库的grep。例如:

$ pcregrep -o 'app.inventory.id=\K[^[:space:]]+' /tmp/corpus

KKK

或者,如果您没有PCRE可用,则可以将grep与扩展正则表达式一起使用,然后使用cut来使用=作为字段分隔符来获取正确的字段。例如:

$ grep -Eo 'app.inventory.id=\K[^[:space:]]+' /tmp/corpus | cut -d= -f2

KKK

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐