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现在它占了。。。有点剽窃:)