【问题标题】:How to pipe file into `egrep`?如何将文件通过管道传输到“egrep”?
【发布时间】:2016-06-15 00:04:57
【问题描述】:

我正在尝试掌握如何使用 egrep 来计算文件中某些内容的出现次数。

如果我有这样的文件,名为myfile:

commas and stuff
more things

然后我可以通过以下方式计算第一个中的o数:

head myfile | egrep -c "o" myfile

由于某种原因,我无法使用管道执行此操作。如果我有这样的文件,名为mypipes:

| my | pipes |

我试过这个:

head mypipes | egrep -c "|" mypipes

这给了我一个错误empty sub(expression),所以我尝试了以下方法:

head mypipes | egrep -c "\|" mypipes

这给了我一个值“1”,这显然是错误的。

如何正确执行此操作?一个完整的解释而不是一次性的解决方案将是惊人的。谢谢。

【问题讨论】:

  • 你想做什么? head 毫无意义。
  • 请注意,egrep 在您在其命令行上指定文件名时会忽略其标准输入。 Thie egrep -c o myfile 导致 egrep 直接读取 myfile 并忽略其标准输入。您可以通过指定仅- 的“文件名”或使用/dev/stdin 使其读取标准输入。因此:egrep -c o myfile -grep -Ec o myfile /dev/stdin。在没有指定文件的情况下,它读取标准输入——这是 Unix 命令的“过滤器”习语。

标签: unix terminal grep


【解决方案1】:

来自手册:

-c, --count
      Suppress  normal output;
      instead print a count of matching lines for each input file.

你计算的是行数,而不是字符数。

egrep -o '\|' | wc -l

注意:您要么提供输入(例如:管道),要么指定要在其中搜索的文件。为什么两者都做?

【讨论】:

  • 考虑使用 grep 代替 egrep 以获得更简单的正则表达式:grep -o '|' mypipes | wc -l
【解决方案2】:

在您构建的示例中,无需将数据通过管道传输到egrep,因为您已经告诉它直接从文件中读取。

如果您不提供文件名,egrep 将改为从 STDIN 读取:

head mypipes | egrep -c "\|"

至于你的其他问题...

这给了我一个值“1”,这显然是错误的。

是吗? egrep -c 计算匹配的行数,在本例中为 1。

如果您想计算出现次数,忽略行,这可能会有所帮助:Count total number of occurrences using grep

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-14
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2015-02-18
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多