【问题标题】:egrep AND operator [duplicate]egrep AND 运算符 [重复]
【发布时间】:2013-02-17 02:36:12
【问题描述】:

我知道 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 行文本,因为它只获取肺部搜索的值,而不是所有三个搜索。

【问题讨论】:

  • sortgrep 有什么关系?我真的没有得到这个。
  • 你的例子应该是egrep "pattern1.*pattern2|pattern2.*pattern1" filename.txt
  • @triplee,这不是重复的。呈现的重复搜索文件中的多个模式,而此问题在同一行中搜索多个模式。

标签: bash grep


【解决方案1】:

怎么样

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

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

【讨论】:

  • 然而,这将重叠 pattern1、pattern2 和 pattern3,为每行提供多个重复结果。
  • @BobDunakey 我没听懂你。你能粘贴一些示例输入和预期输出吗?这样我就可以知道,你想得到什么?
  • 在原始帖子中添加了示例搜索。
  • @BobDunakey 你应该grep .. file|grep..|grep,而不是grep ..file|grep .. file|grep.. file
  • 是的,解决了这个问题,谢谢。
【解决方案2】:

肯特的方法

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

是正确的,它应该更快,只是为了记录,我想发布一个替代方案,它使用egrep 来做同样的事情而不会出现问题:

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

查找p1 followed by p2p2 followed by p1

【讨论】:

    【解决方案3】:

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

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

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

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

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

    egrep -e 'pattern1|pattern2' filename.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 2014-07-18
      • 2015-12-12
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多