如何在bash中连接同一段落中的行

  • 本文关键字:一段 bash 连接 bash
  • 更新时间 :
  • 英文 :


我有一个包含以下行的日志文件:

vi test.log

1月23日01:29:33.498/Globalser:收到来自91.x.x.x:33583的消息:邀请啜饮:39329172xxxx@sip.xSIP/2.0^M支持:^M允许:INVITE、ACK、OPTIONS、CANCEL、BYE^M联系人:sip:131400xxxx@91.x.x.x:33583^M通过:SIP/2.0/UDP 91.x.x.x:33583;分支=z9hG4bKe65d47e55549b753faaf095c3256ec569bde77d37d66f62ff18bc40d492496^M电话号码:ac755ea7e10821aa8174b2e5cd51d9e6^MCseq:1邀请^M发件人:sip:131400xxxx@sip.x;标签=5a541f1b2fd279cd0b8af3be3f67c7cf^M最大远期:70^M收件人:啜饮:39329172xxxx@sip.x^M内容类型:应用程序/sdp^M内容长度:127^M^Mv=0^Mo=匿名1327282173 1327282173IN IP4 91.x.x.x^Ms=会话^Mc=在IP4 91.x.x.x^M中t=0 0^Mm=音频5856 RTP/AVP 0^m1月23日01:29:33.499/GLOBAL/ser:发送消息至91.x.x.x:33583:SIP/2.0 100尝试--您的呼叫对我们很重要^M通过:SIP/2.0/UDP 91.x.x.x:33583;分支=z9hG4bKe65d47e55549b753faaf095c3256ec569bde77d37d66f62ff18bc40d492496^M电话号码:ac755ea7e10821aa8174b2e5cd51d9e6^MCseq:1邀请^M发件人:sip:131400xxxx@sip.x;标签=5a541f1b2fd279cd0b8af3be3f67c7cf^M收件人:啜饮:39329172xxxx@sip.x^M服务器:SSP v2.0.84^M内容长度:0^M^M

我想实现的是:

1月23日01:29:33.498/GLOBAL/ser:RECEIVED message from 91.x.x.x:3583:|INVITE sip:39329172xxxx@sip.xSIP/2.0 |支持:|允许:INVITE、ACK、OPTIONS、CANCEL、BYE |联系人:SIP:1314007008@91.x.x.x:33583 |通过:SIP/2.0/UDP 91.x.x.x:33583;branch=z9hG4bKe65d47e55579b753faaf095c3256ec569bde77d37de66f62ff18bc40d492496|呼叫id:ac755ea7e10821aa8174b2e5cd51d9e6|Cseq:1 INVITE|发件人:sip:131400xxxx@sip.x;tag=5a541f1b2fd279cd0b8af3be3f67c7cf|最大转发次数:70|收件人:sip:39329172xxxx@sip.x|内容类型:application/sdp|内容长度:127|v=0|o=匿名1327282173 1327282173IN IP4 91.x.x.x|s=会话|c=IN IP4 91.x.x|t=0 0|m=音频5856 RTP/AVP 01月23日01:29:33.499/GLOBAL/ser:SENDING message to 91.x.x.x:3583:|SIP/2.0 100 trying--您的呼叫对我们很重要| Via:SIP/2.0/UDP 91.x.x:33583;branch=z9hG4bKe65d47e55579b753faaf095c3256ec569bde77d37de66f62ff18bc40d492496|呼叫id:ac755ea7e10821aa8174b2e5cd51d9e6|Cseq:1 INVITE|发件人:sip:131400xxxx@sip.x;tag=5a541f1b2fd279cd0b8af3be3f67c7cf|收件人:sip:39329172xxxx@sip.x|服务器:SSP v2.0.84 |内容长度:0

基本上,同一段落(会话)中的所有行都应连接"|"。然后应该添加回车符并连接下一段,依此类推;时间

到目前为止,我只能连接所有的行,但无法添加回车。。任何帮助都将不胜感激。非常感谢。

您可以使用以下awk脚本来完成此操作:

awk '{if ($0 ~ /^s*$/) {print line; line="";} else line=line $0 "|"}' file.txt

这是假设在段落结束后总是出现一个空行,和您的示例相同。

解释:

$0 ~ /^s*$/ - to check if line is completely blank or only has white spaces
if block executes when blank line appears. It prints line var and resets line to ""
else block is concatenating line variable with the current line of file and a pipe

这可能对您有用(尽管您的数据不清楚):

sed '1{h;d};/^[123]?[0-9] [JFMASOND].. ..:..:....../{:a;x;s/s*n+/|/g;s/.$//p;d};H;$ba;d' file
23 Jan 01:29:33.498/GLOBAL/ser: RECEIVED message from 91.x.x.x:33583:|INVITE sip:39329172xxxx@sip.x SIP/2.0|Supported:|Allow: INVITE, ACK, OPTIONS, CANCEL, BYE|Contact: sip:131400xxxx@91.x.x.x:33583|Via: SIP/2.0/UDP 91.x.x.x:33583;branch=z9hG4bKe65d47e555749b753faaf095c3256ec569bde77d37de66f62ff18bc40d492496|Call-id: ac755ea7e10821aa8174b2e5cd51d9e6|Cseq: 1 INVITE|From: sip:131400xxxx@sip.x;tag=5a541f1b2fd279cd0b8af3be3f67c7cf|ax-forwards: 70|To: sip:39329172xxxx@sip.x|Content-type: application/sdp|Content-length: 127|v=0|o=anonymous 1327282173 1327282173 IN IP4 91.x.x.x|s=session|c=IN IP4 91.x.x.x|t=0 0|m=audio 5856 RTP/AVP 0
23 Jan 01:29:33.499/GLOBAL/ser: SENDING message to 91.x.x.x:33583:|SIP/2.0 100 trying -- your call is important to us|Via: SIP/2.0/UDP 91.x.x.x:33583;branch=z9hG4bKe65d47e555749b753faaf095c3256ec569bde77d37de66f62ff18bc40d492496|Call-id: ac755ea7e10821aa8174b2e5cd51d9e6|Cseq: 1 INVITE|From: sip:131400xxxx@sip.x;tag=5a541f1b2fd279cd0b8af3be3f67c7cf|To: sip:39329172xxxx@sip.x|Server: SSP v2.0.84|Content-Length: 0

最新更新