好吧,这让我发疯了!我正在尝试从日志文件中 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-