我想按顺序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
......
我知道如何grep
仅针对一种模式,比如num
,但我不知道如何针对多种模式执行此操作。
$ grep "num" originalfile.txt
事实证明,我在awk
似乎找不到的同一行中有一些参数,即:
.... time= 1.234 Gflop/s= 3.4556 .....
它会过滤第一个,但不会过滤Gflop / s。有没有办法在同一条线上重新发现?
答案 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(扩展正则表达式)的一部分,因此您需要使用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
答案 2 :(得分:3)
您还可以使用-e
选项
grep -e num -e length
答案 3 :(得分:2)
Grep允许正则表达式匹配。我们可以使用正则表达式匹配"或"用于搜索多个匹配的语句。
grep 'num=\|length=' file
num=12
length= 128
num= 24
length= 128
|符号表示"或"在正则表达式。因为这是bash我们需要逃避|所以它变成了\ |