仅筛选出每行中文本文件的匹配值

时间:2015-11-18 23:50:45

标签: linux shell awk sed grep

我有一个文件" test.txt"在"版本"

之后,下面的行以及许多额外的东西
egrep -r 'partition|is_active|state|is_default|composite'  test.txt

我试过了:

partition="test",is_active="true",state="on",is_default="true",composite="test123"
partition="gello",is_active="true",state="on",is_default="true",composite="test234"
partition="bolo",is_active="true",state="on",is_default="true",composite="3415"
partition="solo",is_active="true",state="on",is_default="true",composite="hji"

它显示每一行,但我只需要如下所示的特定字段,忽略其余的数据/内容或行

在坚果壳中,我想只显示一行而不是其余的

{{1}}

4 个答案:

答案 0 :(得分:4)

如果您的grep版本支持Perl风格的正则表达式,那么我将使用它:

grep -oP '.*?,\K[^}]+' file

删除第一个逗号前的所有内容(\K将删除任何先前的输出)并将所有内容打印到}

或者,使用awk:

awk -F'}' '{ sub(/[^,]+,/, ""); print $1 }' file

这会将字段分隔符设置为},因此您感兴趣的部分是第一个字段。然后使用sub将部分删除到第一个逗号。

为完整起见,您还可以使用sed:

sed 's/[^,]*,\([^}]*\).*/\1/' file

这会在第一个,之后捕捉到}之后的部分,并用它替换该行的内容。

答案 1 :(得分:3)

grep选择所需的行后,使用sed修改这些行:

sed 's/.*\(partition[^}]*\)} map.*/\1/'

这意味着:"每当您看到任何.*,然后是partition和。{ 任意数量的非},然后} map以及其他任何内容,都可以获取该部分 从partition到第1组,但不包括大括号\(...\)。 替换文本只是第1组\1

使用管道|egrep的输出连接到sed的输入:

egrep ... | sed ...

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r 's/(partition|is_active|state|is_default|composite)="[^"]*"/\n&\n/g;s/[^\n]*\n([^\n]*)\n[^\n]*/\1,/g;s/,$//' file

将问题视为“分解的俱乐部三明治”。确定馅料,取出面包并整理。

答案 3 :(得分:1)

据我所知,您的文件可能有更多行,您不想看,所以我会使用:

sed -n 's/.*\(partition.*\)}.*/\1/p' file

我们使用-n p仅显示我们进行替换的行。替换部分只是得到你需要用模式替换整行的部分。