使用grep匹配多个模式并仅打印匹配的模式

时间:2017-08-24 20:50:29

标签: bash shell

我有一个看起来像

的文件
..<long-text>..."field1":"some-value"...<long-text>...."field2":"some-value"...
..<long-text>..."field1":"some-value"...<long-text>...."field2":"some-value"...
..<long-text>..."field1":"some-value"...<long-text>...."field2":"some-value"...

我想在bash中从文件的每一行中提取field1field2。我希望field1和field2出现在每一行的同一行中。所以输出应该看起来像 -

"field1":"some-value" "field2":"some-value"
"field1":"some-value" "field2":"some-value"
"field1":"some-value" "field2":"some-value"

我写了一个像 -

这样的grep表达式
grep -E '"field1":"[a-z]*".*"field2":"[a-z]*"' -o

但由于中间有.*,它会生成这两个表达式之间的所有文本。我也试过

grep -E '"field1":"[a-z]*"|"field2":"[a-z]*"' -o

但是这会在单独的行中输出所有field1,然后在单独的行中输出所有field2。

如何获得预期的输出?

2 个答案:

答案 0 :(得分:4)

您可以grepawk一起使用来格式化结果:

grep -oE '"(field1|field2)":"[^"]*"' file | awk 'NR%2{p=$0; next} {print p, $0}'

"field1":"some-value" "field2":"some-value"
"field1":"some-value" "field2":"some-value"
"field1":"some-value" "field2":"some-value"

答案 1 :(得分:0)

使用sed

echo abcdef | sed 's/\(.\).*\(.\)/\1\2/'
# yields: af

适合您的情况:

sed 's/.*\("field1":"[a-z]*"\).*\("field2":"[a-z]*"\).*/\1 \2/' yourfile

如果某些行根本不匹配,那么首先执行grep,例如,

grep -Eo '"field1":"[a-z]*".*"field2":"[a-z]*"' yourfile |
  sed 's/.*\("field1":"[a-z]*"\).*\("field2":"[a-z]*"\).*/\1 \2/'