使用 bash 和 wc -l 对其中包含整数的行进行计数

Count lines with integers in them using bash and wc -l

我的 Linux 机器上的一个实用程序将日志输出到 'stdout'。 在每一行中,有一个字符串或一个整数,如下所示:

[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...

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

program | grep '^[0-9].*$' | wc -l

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

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

这里,

^表示行首

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

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

你不需要 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