如何通过 awk 和 grep 将文件名添加到提取的行中

How to prepend the filename to extracted lines via awk and grep

我将以我不了解 awk(或者可能是我需要的 sed?)以及对 grep 和 Linux 的相当基本的知识这一事实作为开场白,所以如果这真的很愚蠢,我深表歉意题。我发现手册页真的很难破译,谷歌搜索让我在解决方案上走得很远,但还不足以将我需要做的两件事联系在一起。解决问题...

我有一些日志文件,我试图从中提取行,它们位于 Linux 服务器上,以 aYYYYMMDD.log 格式命名,它们都是:

Starting Process A
Wed 27 Oct 18:15:39 BST 2021 >>> /dir/task1 start <<<
...
Wed 27 Oct 18:15:40 BST 2021 >>> /dir/task1 end <<<
Wed 27 Oct 18:15:40 BST 2021 >>> /dir/task2 start <<<
...
Wed 27 Oct 18:15:42 BST 2021 >>> /dir/task2 end <<<
...
...
Wed 27 Oct 18:15:53 BST 2021 >>> /dir/taskreporting start <<<
...
Wed 27 Oct 18:15:53 BST 2021 >>> Starting task90 <<<
...
Wed 27 Oct 18:15:54 BST 2021 >>> Finishing task90 <<<
Wed 27 Oct 18:15:54 BST 2021 >>> Starting task91 <<<
...
Wed 27 Oct 18:15:57 BST 2021 >>> Finishing task91 <<<
...
...
Wed 27 Oct 18:16:12 BST 2021 >>> Starting task99 <<<
...
Wed 27 Oct 18:16:27 BST 2021 >>> Finishing task99 <<<
...
Wed 27 Oct 18:16:27 BST 2021 >>> /dir/taskreporting end <<<
...
Ended Process A

(我已经排除了与我的要求无关的日志行;)

我需要在任务报告任务期间找到哪些任务是 运行,我已经设法使用以下命令完成了这些任务(感谢 this other Whosebug post):

awk '/taskreporting start/{flag=1;next}/taskreporting end/{flag=0}flag' <specific filename>.log | grep 'Starting task\|Finishing task'

当我 运行 它针对单个文件并产生如下输出时,这很有效:

Wed 27 Oct 18:15:53 BST 2021 >>> Starting task90 <<<
Wed 27 Oct 18:15:54 BST 2021 >>> Finishing task90 <<<
Wed 27 Oct 18:15:54 BST 2021 >>> Starting task91 <<<
Wed 27 Oct 18:15:57 BST 2021 >>> Finishing task91 <<<
...
Wed 27 Oct 18:16:12 BST 2021 >>> Starting task99 <<<
Wed 27 Oct 18:16:27 BST 2021 >>> Finishing task99 <<<

这正是我想看到的。但是,由于我有多个文件要提取(已适当修改上述命令中的文件名,例如 *.log),我需要在行旁边输出文件名,以便我知道信息属于哪个文件,例如我想看:

a211027.log Wed 27 Oct 18:15:53 BST 2021 >>> Starting task90 <<<
a211027.log Wed 27 Oct 18:15:54 BST 2021 >>> Finishing task90 <<<
a211027.log Wed 27 Oct 18:15:54 BST 2021 >>> Starting task91 <<<
a211027.log Wed 27 Oct 18:15:57 BST 2021 >>> Finishing task91 <<<
...
a211027.log Wed 27 Oct 18:16:12 BST 2021 >>> Starting task99 <<<
a211027.log Wed 27 Oct 18:16:27 BST 2021 >>> Finishing task99 <<<

我用谷歌搜索了一下,似乎 {print FILENAME} 是我所需要的,但我不知道在哪里可以将它添加到我当前的 awk 命令中。如何修改我的 awk 命令以将文件名添加到行的开头?或者有更好的方法来实现我的目标吗?

由于您自己提供了大部分答案,因此只需要 {print FILENAME, [=11=]} 即可将文件名添加到其余内容的前面 [=12=]

awk '/taskreporting start/{flag=1;next}/taskreporting end/{flag=0}flag  {print FILENAME, [=10=]}'  <specific filename>.log