egrep AND 运算符[重复]

问题描述 投票:0回答:3

我知道egrep有一种非常有用的方法可以通过使用以下方式将两个表达式连接在一起:

egrep "pattern1.*pattern2"|egrep "pattern2.*pattern1" filename.txt|wc -l

但是,在搜索三个表达式时,有一种简单的方法可以使用egrep 的 AND 运算符,因为随着添加额外的表达式,排列会呈指数级增加。

我知道使用

sort|uniq -d
的另一种方法,但是我正在寻找一个更简单的解决方案。

编辑:

我当前的搜索方式总共会产生五个结果:

#!/bin/bash
pid=$$
grep -i "angio" rtrans.txt|sort|uniq|egrep -o "^[0-9]+ [0-9]+ " > /tmp/$pid.1.tmp
grep -i "cardio" rtrans.txt|sort|uniq|egrep -o "^[0-9]+ [0-9]+ " > /tmp/$pid.2.tmp
grep -i "pulmonary" rtrans.txt|sort|uniq|egrep -o "^[0-9]+ [0-9]+ " > /tmp/$pid.3.tmp
cat /tmp/$pid.1.tmp /tmp/$pid.2.tmp|sort|uniq -d > /tmp/$pid.4.tmp
cat /tmp/$pid.4.tmp /tmp/$pid.3.tmp|sort|uniq -d > /tmp/$pid.5.tmp
egrep -o "^[0-9]+ [0-9]+ " /tmp/$pid.5.tmp|getDoc.mps > /tmp/$pid.6.tmp
head -10 /tmp/$pid.6.tmp

mumps@debianMumpsISR:~/Medline2012$ AngioAndCardioAndPulmonary.script 
1514 Structural composition of central pulmonary arteries. Growth potential after surgical shunts.
1517 Patterns of pulmonary arterial anatomy and blood supply in complex congenital heart disease
with pulmonary atresia
3034 Controlled reperfusion following regional ischemia.
3481 Anaesthetic management for oophorectomy in pulmonary lymphangiomyomatosis.
3547 A comparison of methods for limiting myocardial infarct expansion during acute reperfusion--
primary role of unload

同时:

mumps@debianMumpsISR:~/Medline2012$ grep "angio" rtrans.txt|grep "cardio" rtrans.txt|grep "pulmonary" rtrans.txt|wc -l
185

产生 185 行文本,因为它仅获取肺部搜索的值,而不是所有三个搜索。

bash grep
3个回答
10
投票

怎么样

grep "pattern1" file|grep "pattern2"|grep "pattern3" 

这将给出包含 p1、p2 和 p3 的行。但顺序任意。


2
投票

肯特的方法与

grep "pattern1" file|grep "pattern2"|grep "pattern3" 

是正确的,它应该更快,只是为了记录,我想发布一个替代方案,使用

egrep
做同样的事情而不用 pipping:

egrep "pattern1.*pattern2|pattern2.*pattern1" file

寻找

p1 followed by p2
p2 followed by p1
。 编辑:在较新版本的 grep 中,您可以通过添加
-e
标志

来执行扩展 grep
grep -E "pattern1.*pattern2|pattern2.*pattern1" file

1
投票

最初的问题是为什么他的egrep命令不起作用。

egrep "pattern1.*pattern2"|egrep "pattern2.*pattern1" filename.txt|wc -l

Kent 和 Stanislav 通过将 filename.txt 放在前面来指出语法错误,这是正确的。但这并没有解决最初的问题。

Bob 的“当前方式”(4 年前)是一种多命令方法,用于在不同行上 grep 出不同的关键字。换句话说,他的脚本正在寻找一组包含 any 他的搜索词的行。其他提出的解决方案只会导致包含他的搜索词的all的行,这似乎不是他的意图。

相反,他可以使用单行egrep来查找任何的术语,如下所示:

egrep -e 'pattern1|pattern2' filename.txt
© www.soinside.com 2019 - 2024. All rights reserved.