一次使用一个grep两个结果

时间:2016-12-25 19:21:07

标签: linux bash unix grep

我有这个文件

something1
something2 username": "John" something3
something4
....
something5 salaryunit="dollar" something6
something7

我想得到这个结果

John dollar

username": "John" salaryunit="dollar"

我试过

grep -oP 'username":".*?"\|salaryunit=".*?"' file

但它会出错。怎么了?

1 个答案:

答案 0 :(得分:0)

给定grep版本(例如GNU grep),支持-P选项启用的PCRE(Perl兼容正则表达式)并支持-o }选项只打印匹配的东西 - 这两者都不是POSIX规定的 - 那么你需要在管道之前删除反斜杠,并在问题中命令的第二个双引号之前添加一个空格。

给定数据文件:

something1
something2 username": "John" something3
something4
....
something5 salaryunit="dollar" something6
something7
username": "John" salaryunit="dollar"

运行显示的命令会产生显示的输出:

$ grep -oP 'username": ".*?"|salaryunit=".*?"' file
username": "John"
salaryunit="dollar"
username": "John"
salaryunit="dollar"
$

请注意,当模式在单行输入(样本数据中的最后一行)上匹配两次时,-o选项会在两个单独的行上输出两个单独的匹配项。当匹配输入位于两条不同的行上时,当然输出也在两条不同的行上。

如果您要求输出单行',则需要指定所需的扩充文件输出,或者文件的变体,其中包含20个通过该文件传播的匹配项。如果您想成对使用它们,如果两个salaryunit条目之间没有username,或者两个username条目之间没有salaryunit,会发生什么?等

如果你确信这些条目总是成对出现,并且始终在username然后salaryunit的序列中,那么将一对行组合成单行的简单方法是:

$ grep -oP 'username": ".*?"|salaryunit=".*?"' file | paste -d ' ' - -
username": "John" salaryunit="dollar"
username": "John" salaryunit="dollar"
$

- -的{​​{1}}表示法意味着从标准输入读取一行,然后再读取一行,并将该组合打印为单行'。默认情况下,行由制表符分隔;使用paste意味着他们会被一个空格分开。使用较长的分隔符不起作用;第一个字符用于分隔前两个字段,字符串中的第二个字符分隔第二个和第三个字段,依此类推。