从文件中抓取多行

时间:2013-08-10 14:53:09

标签: regex grep

我想按顺序grep一个文件的多行。 文件originalfile.txt的示例可以是:

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

我希望grep只有像numlength所有人那样有价值的行:

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 个答案:

答案 0 :(得分:8)

使用-E选项

来自man grep

  

-E, - extended-regexp

     

将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

答案 1 :(得分: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(扩展正则表达式)的一部分,因此您需要使用egrepgrep -E)。这意味着以=开头但没有变量名称的行将不匹配。

$ 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

答案 2 :(得分:3)

您还可以使用-e选项

将多个模式传递给grep
grep -e num -e length

答案 3 :(得分:2)

Grep允许正则表达式匹配。我们可以使用正则表达式匹配"或"用于搜索多个匹配的语句。

grep 'num=\|length=' file

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

|符号表示"或"在正则表达式。因为这是bash我们需要逃避|所以它变成了\ |