标题: [问题求助] sed/awk如何实现基于关键字对单行文本进行分行处理? [打印本页]
作者: benjaminxu 时间: 2014-6-10 20:12 标题: sed/awk如何实现基于关键字对单行文本进行分行处理?
我有一段文本,是单行文本,其中有些关键字是相同的,我想基于这些关键字进行自动分行处理,如何处理?
其中id=tos在此文本中出现多次,要想基于这个关健字进行自动分行,再生写入到另外一个文件中,要如何处理呢?请各位高手指教,谢谢。
示例文本如下:
id=tos time="2014-05-23 12:31:48" fw=?А?¢?-???? pri=6 type=conn recorder=session src=10.10.2.27 dst=114.80.235.7 proto=tcp sport=53632 dport=80 inpkt=5 outpkt=4 sent=648 rcvd=254 duration=26 connid=591593823 parent=0 op=delete msg="null" id=tos time="2014-05-23 12:31:48" fw=?А?¢?-???? pri=6 type=conn recorder=session src=10.10.2.28 dst=180.153.100.168 proto=tcp sport=52997 dport=80 inpkt=5 outpkt=6 sent=348 rcvd=776 duration=21 connid=180050450 parent=0 op=delete msg="null" id=tos time="2014-05-23 12:31:48" fw=?А?¢?-???? pri=6 type=conn recorder=session src=10.10.2.29 dst=210.52.217.129 proto=tcp sport=43930 dport=443 inpkt=121 outpkt=371 sent=5855 rcvd=545116 duration=23 connid=97170603 parent=0 op=delete msg="null" id=tos time="2014-05-23 12:31:48" fw=?А?¢?-???? pri=6 type=conn recorder=session src=10.10.2.27 dst=183.61.252.236 proto=tcp sport=53554 dport=80 inpkt=6 outpkt=4 sent=1262 rcvd=536 duration=28 connid=616757769 parent=0 op=delete msg="null" id=tos time="2014-05-23 12:31:48" fw=?А?¢?-???? pri=6 type=conn recorder=session src=202.158.163.8 dst=10.10.2.207 proto=tcp sport=24223 dport=443 inpkt=8 outpkt=6 sent=905 rcvd=1642 duration=21 connid=693002827 parent=0 op=delete msg="null"
作者: 522235677 时间: 2014-6-10 20:47
要想基于这个关健字进行自动分行,再生写入到另外一个文件中,
分析什么?把什么写到另一个文本
作者: cjiabing 时间: 2014-6-10 20:51
可以做到,但如果行太长了只能用第三方
作者: benjaminxu 时间: 2014-6-10 21:18
回复 2# 522235677
这些文本是一些网络设备syslog发送出来的日志,但设备在发送的时候将多行日志作为一行发出来了,我需要对这对这些原始日志进行分解解析,所以需要将多行汇成的日志自动分成原始多行,再对其第行进行解析,所以需要写入到文本中,才能用于新的解析。
2楼的高手有没有好办法帮忙实现?
作者: benjaminxu 时间: 2014-6-10 21:19
回复 3# cjiabing
3楼的有什么高见吗?
作者: benjaminxu 时间: 2014-6-10 21:20
我查看了相关命令,如sed,awk可能可以实现,但我不熟悉这些命令,叨念高手能够帮忙指导一下,不胜感激!
作者: DAIC 时间: 2014-6-10 21:48
- sed "s/id=tos/\n&/g" a.txt > b.txt
复制代码
作者: 522235677 时间: 2014-6-10 21:51
- @echo off & setlocal enabledelayedexpansion
-
- set lf=^
-
-
- (for /f "delims=" %%i in (1.txt) do (
- set "$=%%i"
- for %%a in ("!lf!") do echo !$: =%%~a!
- ))>2.txt
- pause
复制代码
http://www.bathome.net/viewthrea ... hlight=%BB%BB%D0%D0
作者: CrLf 时间: 2014-6-10 23:51
本帖最后由 CrLf 于 2014-6-11 01:48 编辑
这个问题还是用 7 楼 sed 比较好,如果要用 gawk 的话没那么直接,不过也是挺好玩的~
可以这样:- gawk "BEGIN{RS=\"id=tos\"}/./{print RS $0}" a.txt
复制代码
或- gawk "BEGIN{RS=\"id=tos\"}$1~sub(/^/,RS)" a.txt
复制代码
也可以这样:- gawk -F"id=tos" "{for(i=2;i<=NF;i++)print FS $i RS}" a.txt
复制代码
用四楼的正则就是这样:- gawk "gsub(/id=tos/,\"\n^&\")" a.txt
复制代码
或- gawk "$0=gensub(/\s(id=tos)/,\"\n\\1\",\"g\")" a.txt
复制代码
也可用域赋值技巧:- gawk -F"id=tos" "{OFS=RS FS;$1=$1;print}" a.txt
复制代码
简写:- gawk -F"id=tos" "OFS=RS FS ($1=$1)" a.txt
复制代码
作者: Linuxer 时间: 2014-7-29 14:37
本帖最后由 Linuxer 于 2014-7-29 14:38 编辑
回复 7# DAIC
请教一下,为什么我测试这个代码,没有达到效果呢。执行后,就相当于把id=tos变成nid=tos
我是在win下使用的,GNU sed version 3.02,,是版本的低的原因吗?
作者: DAIC 时间: 2014-7-29 14:56
回复 10# Linuxer
试试4.2.2这个版本
作者: Linuxer 时间: 2014-7-29 15:01
回复 11# DAIC
多谢,,刚刚从你签名找过去了,更新了4.2.2版本,发现真的生效了。。看来就是版本低的原因啊。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |