我將首先說明我不了解 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
(我已經排除了與我的要求無關的日志行;)
我需要找到在 taskreporting 任務期間運行的任務,我已經使用以下命令設法完成了(感謝其他 stackoverflow 帖子):
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 <<<
這幾乎是我想看到的。但是,由于我有多個檔案要提取(在上面的命令中適當地修改了檔案名,例如 to *.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 命令以使其將檔案名添加到行的開頭?或者有沒有更好的方法來實作我的目標?
uj5u.com熱心網友回復:
由于您自己提供了大部分答案,因此所需要做的就是{print FILENAME, $0}在其余內容前添加檔案名$0
awk '/taskreporting start/{flag=1;next}/taskreporting end/{flag=0}flag {print FILENAME, $0}' <specific filename>.log
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/341860.html
下一篇:在Windows上,我*必須*在呼叫CreateProcess()后呼叫WaitForSingleObject()嗎?
