使用 grep 打印匹配后的剩余行

使用 grep 打印匹配后的剩余行

好吧,这让我发疯了!我正在尝试从日志文件中 grep 一些信息并将其添加到电子邮件通知中的摘要中。

来自日志:

2019/07/22 11:36:03 [14396] 创建的文件数量:3(reg:2,dir:1)

现在我希望打印的只是末尾的数字,3、2、1 或者整个最后部分 3(reg:2,dir:1)

我尝试过不同的方法,这是我得到的最接近的,但它只打印数字 3 而不是我想要的其余信息。

nf=$(grep -o 'created files:' $logfile) | cut -d\   -f3)

这有可能吗?

编辑:

好的,所以我使用它来工作nf=$(grep -Po 'created files: \K.*' "$logfile")

在我的摘要中,我添加 $nf 以获得这样的输出,Created $nf new files给出了这个结果

创建了 3 个(reg: 2,dir: 1)新文件

现在,我可以以某种方式将其进一步拆分,以便我的结果会是这样的吗?创建了1个目录和2个文件

也许使用两个单独的 grep 命令来输出不同的变量,一个用于 dir,一个用于该行上的 reg?

答案1

如果您grep支持与 perl 兼容的正则表达式 (PCRE):

$ grep -Po 'created files: \K.*' "$logfile"
3 (reg: 2, dir: 1)

要将数字保存到数组中bash

$ numbers=( $(grep -o 'created files:.*' "$logfile" | grep -o '[0-9]\+') )
$ echo ${numbers[@]}
3 2 1
$ echo "${numbers[0]}, ${numbers[1]}, ${numbers[2]}"
3, 2, 1

答案2

Perl 来拯救:

$ perl -ne 'print "$1 $2 $3\n" if /created files: (\d+) \(reg: (\d+), dir: (\d+)\)/' < "$logfile"
3 2 1

或与sed

$ sed -nEe 's/.*created files: ([0-9]+) \(reg: ([0-9]+), dir: ([0-9]+)\)/\1 \2 \3/p' "$logfile"
3 2 1

两者主要做相同的事情:匹配行的整个结尾部分(不仅仅是created files),但捕获(使用(...))数字并打印它们或用它们替换行。

答案3

要修复您的命令:

  • 添加.*到模式以在grep输出中包含该行的其余部分。
  • 用于-f3-选择从第三个到最后一个的所有字段。

-->

grep -o 'created files: .*' "$logfile" | cut -d\  -f3-

答案4

用于cut提取 3 之后的所有字段:

grep -o 'created files:' $logfile | cut -d" " -f3-

相关内容