Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 对多个搜索模式使用grep_Unix_Grep - Fatal编程技术网

Unix 对多个搜索模式使用grep

Unix 对多个搜索模式使用grep,unix,grep,Unix,Grep,假设我有以下数据流: BODY1 attrib1: someval11 attrib2: someval12 attrib3: someval13 BODY2 attrib1: someval21 attrib2: someval22 attrib3: someval23 BODY3 attrib1: someval31 attrib2: someval32 attrib3: someval33 我只想为每个实体提取attrib1和attrib3,即 attrib1:

假设我有以下数据流:

BODY1
attrib1:  someval11
attrib2:  someval12
attrib3:  someval13

BODY2
attrib1:  someval21
attrib2:  someval22
attrib3:  someval23

BODY3
attrib1:  someval31
attrib2:  someval32
attrib3:  someval33
我只想为每个实体提取attrib1和attrib3,即

attrib1:  someval11
attrib3:  someval13
attrib1:  someval21
attrib3:  someval23
attrib1:  someval31
attrib3:  someval33
我试过了


grep'attrib1\| attrib3'
,但没有返回任何内容
grep attrib1
grep attrib2
只返回指定的单个模式的数据。

grep-e'attrib1'-e'attrib3'文件

man
页面:

-e模式,--regexp=PATTERN
使用模式作为模式。这可用于指定 多个搜索模式,或保护以 连字符(-)。(-e由POSIX指定。)

编辑: 或者,您可以将图案保存在文件中,并使用
-f
选项:

aman@aman-VPCEB14EN:~$ cat>patt
attrib1
attrib3

aman@aman-VPCEB14EN:~$ grep -f patt test
attrib1:  someval11
attrib3:  someval13
attrib1:  someval21
attrib3:  someval23
attrib1:  someval31
attrib3:  someval33

这在GNU grep 2.6.3中起作用

grep "attrib[13]"


这取决于你所处的环境
grep-iw'patter1\| patter2\| patter3'
适用于bash shell,而不适用于korn shell。对于korn shell,我们可能必须尝试
grep-e pattern 1-e pattern 2
等等

egrep "pattern1|pattern2|pattern3" file
非常简单的命令:

 bash> grep  "attrib1\|attrib3" <file.name>
attrib1:  someval11
attrib3:  someval13
attrib1:  someval21
attrib3:  someval23
attrib1:  someval31
attrib3:  someval33
bash>grep“attrib1\| attrib3”
属性1:someval11
属性3:someval13
属性1:someval21
属性3:someval23
属性1:someval31
属性3:someval33

这并不是说它解决了您的问题,但如果您的正则表达式是
attrib[13]
,grep可能会更容易理解,更快地找到。使公共部分更长通常更好。如果属性1和属性3之间没有公共模式怎么办?如果它们被命名为完全不同的东西?在真实的例子中,我的attrib1被称为foo,attrib3被称为bar…那么
attrib[13]
技巧将不起作用。我不明白——它必须是grep吗?axiom演示了如何做到这一点,但为什么不使用awk呢?我是唯一一个觉得这类任务更简单的人吗。我正在使用SunOS@foampile您可以尝试查看
-f
选项是否有用。另外请注意,对于您的示例,
grep'attrib1\| attrib3'
也应该可以正常工作。如果attrib1和3之间没有公共模式呢?如果它们被命名为完全不同的名称?您在寻找什么,在第一个单词的末尾加1或3,后面加一个冒号?您使用的shell与
grep
external命令支持的参数没有直接关系。或者
grep-E“pattern1 | pattern2 | pattern3”文件
 bash> grep  "attrib1\|attrib3" <file.name>
attrib1:  someval11
attrib3:  someval13
attrib1:  someval21
attrib3:  someval23
attrib1:  someval31
attrib3:  someval33