Regex 将文件中的多行变灰

Regex 将文件中的多行变灰,regex,grep,Regex,Grep,我想把一个文件分成多行。 文件originalfile.txt的示例可以是: num=12 workers not specified length= 128 Using array element num= 24 workers not specified length= 128 Using array element ...... 我只想grep像所有带有num和length的有价值的行: num=12 length= 128 num= 24 length= 128 ......

我想把一个文件分成多行。 文件
originalfile.txt
的示例可以是:

num=12
workers not specified
length= 128
Using array element 
num= 24 
workers not specified
length= 128
Using array element 
......
我只想
grep
像所有带有
num
length
的有价值的行:

num=12
length= 128
num= 24 
length= 128
......
我知道如何对一个模式执行
grep
,比如说
num
,但我不知道如何对多个模式执行

$ grep "num" originalfile.txt
原来我在同一行中有一些参数,
awk
似乎找不到,即:

。。。。时间=1.234 Gflop/s=3.4556…..


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

这应该可以做到:

$ 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
)。这意味着以
=
开头且没有变量名的行将不匹配

$ 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

使用
-E
选项

grep -e num -e length
发件人:

-E、 --扩展regexp

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

如果您只想获取可以通过管道传送到
awk

grep -E 'length|num' data | awk -F'= ?' '{print $2}'
但是,您可以在一个signle-awk命令中完成这一切,并避免grep

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

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

grep 'num=\|length=' file

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

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

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

grep -e num -e length

bash
与您为什么需要转义
|
无关,因为
是扩展正则表达式的一部分,默认情况下
grep
只使用基本正则表达式。它是一个GNU扩展,允许通过转义使用ERE,或者放弃转义并使用
egrep/grep-E
。这很有用。你知道如何只打印
=
后面的元素,即只打印数字吗?你的
awk
脚本不占空间。@sudo\O现在它占了。。。有点剽窃:)