【问题标题】:Count lines with integers in them using bash and wc -l使用 bash 和 wc -l 计算其中包含整数的行
【发布时间】:2020-02-15 18:18:11
【问题描述】:

我的 Linux 机器上的一个实用程序将日志输出到“stdout”。 在每一行中,有一个 String 或一个 Integer,如下所示:

[ERROR] resource busy, retrying
0989282882
[DEBUG] starting process with pid 4028
7918361566
1037491392
[DEBUG] starting process with pid 4056
2873187983
7853738301
1290312037
[DEBUG] done with init
1872989829
[DEBUG] cleaning up
8917982882

(实际上更长)

我想计算其中包含整数的行。

我已经使用:program | grep DEBUG | wc -l 来获取调试计数(ERROR 相同)

但是我如何计算整数呢?它们没有像字符串这样的静态内容,我可以 grep...

【问题讨论】:

    标签: bash shell grep wc


    【解决方案1】:

    你可以在指定正则表达式后使用grep来识别整数。

    对于这种特殊情况, grep -E "^[0-9]+" | wc -l 应该可以。

    这里,

    ^ 表示行首

    [0-9] 表示从 0 到 9 的任意数字

    + 表示一个或多个这样的数字

    【讨论】:

      【解决方案2】:

      这个你不需要 wc,grep 有-c

      program |  grep -c -E -x '[[:digit:]]+'
      
      • -c 仅打印选定行的计数
      • -E 扩展正则表达式(您可以省略它并使用模式[0-9]\+
      • -x 匹配整行而不是其中的一部分

      POSIX grep manual

      或者,由于您还提到了[DEBUG],您可以使用awk 进行单次传递(特别是如果您的program 不是idempotent

      program | awk  '/^[0-9]+$/ { numbers++ } /^\[DEBUG\]/ {debugs++} END { print numbers,debugs }'
      

      POSIX awk manual

      【讨论】:

        【解决方案3】:

        我会这样做program | grep -E "^[0-9]+" | wc -l。这将匹配以 1 个或多个数字开头的行。对于您的用例来说似乎已经足够了。

        【讨论】:

          【解决方案4】:
          program | grep '^[0-9].*$' | wc -l
          

          【讨论】:

            猜你喜欢
            • 2016-05-24
            • 1970-01-01
            • 2010-11-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-01
            • 2020-05-10
            • 1970-01-01
            相关资源
            最近更新 更多