5

我想按顺序排列文件的多行。该文件的一个示例originalfile.txt可能是:

num=12
workers not specified
length= 128
Using array element 
num= 24 
workers not specified
length= 128
Using array element 
......

grep只想像所有带有numand的行一样有价值的行length

num=12
length= 128
num= 24 
length= 128
......

我知道如何只grep针对一种模式,比如说,num但我不知道如何针对多种模式进行操作。

$ grep "num" originalfile.txt

事实证明,我在同一行中有一些 awk似乎找不到的参数,即:

.... time= 1.234 Gflop/s= 3.4556 .....

它过滤第一个,但不过滤 Gflop/s。有没有办法在同一行递归查找?

4

4 回答 4

11

使用-E选项

man grep

-E,--扩展正则表达式

将 PATTERN 解释为扩展的正则表达式(见下文)。

$ grep -E 'length|num' data
num=12
length= 128
num= 24 
length= 128

如果您只想获取可以通过管道发送的数字,请更新awk

grep -E 'length|num' data | awk -F'= ?' '{print $2}'

但是你可以在一个signle awk命令中完成这一切,并避免使用grep

awk -F'= ?' '/length/||/num/{print $2}' data
于 2013-08-10T14:58:01.847 回答
3

您还可以使用-e选项将多个模式传递给 grep

grep -e num -e length
于 2013-08-10T17:23:28.550 回答
3

这应该可以解决问题:

$ grep '^\w*=' file
num=12
length= 128
num= 24 
length= 128

解释:

^   # Start of line
\w  # Word class, shorthand for [a-zA-Z0-9_]
*   # Quantifier (zero or more)
=   # Equals character

量词可能更好(一个或多个),它是 ERE(扩展正则表达式)的+一部分,因此您需要使用egrep( grep -E)。这意味着以 a 开头=且没有变量名的行将不匹配。

$ egrep '^\w+=' file
num=12
length= 128
num= 24 
length= 128 

编辑:

对于您在评论中发现的第二个问题,仅打印我们花哨的使用的数字值grep

$ grep -Po '^\w+=\s?\K\d+' file
12
128
24
128

或使用脚本语言,如awk

$ awk -F'= ?' '/\w*=/{print $2}' file
12
128
24 
128
于 2013-08-10T14:56:06.347 回答
2

Grep 允许正则表达式匹配。我们可以使用带有“或”语句的正则表达式匹配来搜索多个匹配项。

grep 'num=\|length=' file

num=12
length= 128
num= 24 
length= 128

的| 符号在正则表达式中表示“或”。因为这是 bash 我们需要转义 | 所以它变成了\|

于 2013-08-10T14:59:39.773 回答