我试图使用AWK(或SED或两者的组合)来解析包含特定字符串“ Info:AgentSession ”的日志文件。 我想包含包含START Info:AgentSessionInfo:AgentSession ”字符串的行,但不包括END字符串行,它将是“ [2015- ”。

以下是CentOS服务器上的文本日志文件片段:


[2015-03-30 12:23:10.999] [124] [Info:AgentSession] Handling Agent message for PieraC 
Request: ReceiveReady
Action: DoNotDisturb

[2015-03-30 12:23:11.000] [124] [Info:AgentSession] Sending agent message to PieraC 
Response: ReceiveReady
RequestId: 
Status: Ok
Message: 
IsReady: False

[2015-03-30 12:23:11.000] [49] [Info:Database] (BZ2411) (SqlTaskWorker.ProcessTasks) Attempting to run task. Thread: SqlTaskWorker-37. StartTime: 1/1/0001 12:00:00 AM. ConnectionTimeout: 15. ConnectionState: Open.

[2015-03-30 12:23:11.501] [111] [Info:Dialer] Sending Dialer message
Action: UsmCommand
Command: Transfer
IsTransfered: False

[2015-03-30 12:23:11.502] [111] [Info:AgentSession] Sending agent message to MatthewW 
ActivityState: Wrapup
IsReady: False
IsSipRegistered: True

[2015-03-30 12:23:11.502] [79] [Info:Database] (BZ2411) (SqlTask.Execute) Attempting to start. Thread: SqlTaskWorker-67. 

[2015-03-30 12:23:16.207] [124] [Info:AgentSession] Sending agent message to PieraC 
Response: NonQuery
Status: Ok
Message: Query sent successfully

[2015-03-30 12:23:16.207] [88] [Info:Database] (BZ2411) (SqlTaskWorker.ProcessTasks) Attempting to run task. Thread: SqlTaskWorker-76. 
[2015-03-30 12:23:16.207] [88] [Info:Database] (BZ2411) (SqlTask.Execute) Attempting to start. Thread: SqlTaskWorker-76. 
[2015-03-30 12:23:16.208] [88] [Info:Database] (BZ2411) (SqlNonQueryTask.ExecuteCommand) Attempting to start. Thread: SqlTaskWorker-76. 
[2015-03-30 12:23:16.268] [124] [Info:AgentSession] Handling Agent message for PieraC 
Request: CallAction
CallDisposition: 


当我运行以下命令时:


awk '/Info:AgentSession/ {flag=1;next} /\[2015-/{flag=0} flag {print}' test.log


我得到以下输出:


Request: ReceiveReady
Action: DoNotDisturb

Response: ReceiveReady
RequestId:
Status: Ok
Message:
IsReady: False

ActivityState: Wrapup
IsReady: False
IsSipRegistered: True

Response: NonQuery
Status: Ok
Message: Query sent successfully

Request: CallAction
CallDisposition:


但是我希望这个输出包含“ Info:AgentSession ”的START字符串,所以实际上最终看起来像这样(省略所有其他不引用START字符串的部分,使用DATE字符串的开头) “ [2015- ”作为结束字符串):


[2015-03-30 12:23:10.999] [124] [Info:AgentSession] Handling Agent message for PieraC 
Request: ReceiveReady
Action: DoNotDisturb

[2015-03-30 12:23:11.000] [124] [Info:AgentSession] Sending agent message to PieraC 
Response: ReceiveReady
RequestId: 
Status: Ok
Message: 
IsReady: False

[2015-03-30 12:23:11.502] [111] [Info:AgentSession] Sending agent message to MatthewW 
ActivityState: Wrapup
IsReady: False
IsSipRegistered: True


[2015-03-30 12:23:16.207] [124] [Info:AgentSession] Sending agent message to PieraC 
Response: NonQuery
Status: Ok
Message: Query sent successfully

[2015-03-30 12:23:16.268] [124] [Info:AgentSession] Handling Agent message for PieraC 
Request: CallAction
CallDisposition: 


这可以用简单的AWK或SED命令吗?

#1楼 票数:1 已采纳

使用awk

awk '/^[[]/{f=0} /Info:AgentSession/{f=1} f' file

这个怎么运作

awk遍历每一行输入。 对于每一行,程序决定是否将变量f设置为true(1)或false(0)。 如果f为真,则打印该行。

  • /^[[]/{f=0}

    任何时候一行以[f设置为false开头。

  • /Info:AgentSession/{f=1}

    如果该行包含字符串Info:AgentSession ,则覆盖上一个命令,并将f设置为true。

  • f

    如果f为真,则awk打印该行。

    以上是f{print $0}简写,其中,在awk中, $0表示整行。

#2楼 票数:0

您可以使用sed的简单循环:

sed -n '/Info:AgentSession/{:a;p;n;/^$/!ba;p}' input.file

该命令搜索包含模式/Info:AgentSession/ 如果出现这样的一行,则执行大括号{}之间的以下块。 在那个块中,我们简单地为循环调用定义一个开始标签:a 然后我们打印当前行p ,从输入n获取下一行并检查它是否为空/^$/ 如果行不空! 我们退回到循环ba开始。 否则,我们将该空行打印为记录分隔符,然后再次在下一行输入中搜索/Info:AgentSession/

使用-n命令行选项可以抑制其他行的输出。

输出:

[2015-03-30 12:23:10.999] [124] [Info:AgentSession] Handling Agent message for PieraC 
Request: ReceiveReady
Action: DoNotDisturb
[2015-03-30 12:23:11.000] [124] [Info:AgentSession] Sending agent message to PieraC 
Response: ReceiveReady
RequestId: 
Status: Ok
Message: 
IsReady: False

[2015-03-30 12:23:11.502] [111] [Info:AgentSession] Sending agent message to MatthewW 
ActivityState: Wrapup
IsReady: False
IsSipRegistered: True

[2015-03-30 12:23:16.207] [124] [Info:AgentSession] Sending agent message to PieraC 
Response: NonQuery
Status: Ok
Message: Query sent successfully

[2015-03-30 12:23:16.268] [124] [Info:AgentSession] Handling Agent message for PieraC 
Request: CallAction
CallDisposition: 

另一种方法是使用这样的awk

awk -F'\n' '$1 ~ /Info:AgentSession/' RS='\n\n' ORS='\n\n' input.file

我将输入和输出分隔符定义为两个换行符的序列。 字段分隔符是单个换行符。 如果我们记录的第一个字段包含Info:AgentSession模式,我们将打印整个记录。


顺便说一句,上面的sed命令也可以在没有-n选项的情况下编写:

sed '/Info:AgentSession/{:a;n;/^$/!ba;p};d' input.file

在这种情况下,我们正在搜索包含/Info:AgentSession/的行,如果找到这样的行,则在花括号之间执行以下块。 我们定义一个标签:a ,打印当前行并从输入n获取下一行。 只要非空行将跟随/^$/! 我们退回到循环ba的开始,否则我们将该空行打印为记录分隔符p 所有其他行都被删除了d

#3楼 票数:0

这可能适合你(GNU sed):

sed -n '/Info:AgentSession/,/^$/p' file

  ask by Chris Charles translate from so

未解决问题?本站智能推荐:

4回复

查找文档中其他2个字符串之间的字符串

我发现有很多解决方案可以做到我想要的,只有一个例外。 我需要搜索一个.html文档并提取一个字符串。 包含字符串的行将如下所示(1行,没有换行符) 我需要得到的文字是 INV_CHEST_LEATHER_09 当我使用awk,grep和sed时,我提取了ic
5回复

如何使用 vi 或 sed 替换指定字符串之间多次出现的字符?

我试图替换 "," 仅当它出现在 65510 和 "i" 之间时: 所以所需的输出是: 我尝试了以下方法: 但输出只替换最后一个“,”:
3回复

使用sed或awk获取标签之间的路径

我想从ps输出获取路径 (/ tmp / deployment / deployment / hostVBox_8080_GSA /): 我怎样才能做到这一点? BR科莱萨
3回复

使用sed或awk将匹配的字符串从上一行插入到当前行

我有一个CSV文件,该文件每半小时显示一次链接的统计信息。 链接名称仅出现在00:00行。 如何使用sed或awk将链接名称复制到其他所有行,直到链接名称不同?
2回复

使用 awk sed 等。 从没有结束标签的文件中解析字段

我想要的输出是一个逗号分隔的文件。 如果所有其他方法都失败了,我知道我可以使用 for/each 逻辑或其他东西编写脚本,但我希望使用 awk 和 sed 找到一个优雅的解决方案,它们以前对我有用过很多次。 我只是被这个难住了。 下面是数据的表示,然后是所需的结果。 注意:每个 GROUPNUMB
4回复

在Unix中使用awk或sed进行解析

我有多个文件,成千上万的记录具有以下格式: 2010/08/10 10:07:52|TrainZoom|1393|38797|MyCustomerAPI->,mask = ZPTA,TransId = 1281460071578,testing :-> , capture -&g
3回复

使用Grep / Sed / Awk拆分XML文件?

试图找出最佳方法(通过使用我在Grep / Sed / Awk中所知的方法)基于单个字符串(键?)分割XML文件。 我有一个XML文件,该文件是我所有当前FAQ条目的SQL转储,因此它包含一个条目ID,然后是一个相当大的HTML格式的文档。 我希望将这些条目分开,以便我可以轻松地将它们弹出到
3回复

使用awk或sed从ifconfig解析数据?

我试图用sed解析ifconfig输出中的一些数据,但我无法正确执行。 我希望命令只提取我之后的数字。 例如,我有兴趣提取发送的字节: 如果我使用sed: 我得到这个输出: 但我只对'9040627感兴趣'有没有办法用sed做,或者我应该使用awk或其他替代品?