[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 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"

要想基于这个关健字进行自动分行,再生写入到另外一个文件中,
分析什么?把什么写到另一个文本

TOP

可以做到,但如果行太长了只能用第三方
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 2# 522235677
这些文本是一些网络设备syslog发送出来的日志,但设备在发送的时候将多行日志作为一行发出来了,我需要对这对这些原始日志进行分解解析,所以需要将多行汇成的日志自动分成原始多行,再对其第行进行解析,所以需要写入到文本中,才能用于新的解析。
2楼的高手有没有好办法帮忙实现?

TOP

回复 3# cjiabing

3楼的有什么高见吗?

TOP

我查看了相关命令,如sed,awk可能可以实现,但我不熟悉这些命令,叨念高手能够帮忙指导一下,不胜感激!

TOP

  1. sed "s/id=tos/\n&/g" a.txt > b.txt
复制代码

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. set lf=^
  3. (for /f "delims=" %%i in (1.txt) do (
  4.     set "$=%%i"
  5.     for %%a in ("!lf!") do echo !$: =%%~a!
  6. ))>2.txt
  7. pause
复制代码
http://www.bathome.net/viewthrea ... hlight=%BB%BB%D0%D0

TOP

本帖最后由 CrLf 于 2014-6-11 01:48 编辑

这个问题还是用 7 楼 sed 比较好,如果要用 gawk 的话没那么直接,不过也是挺好玩的~
可以这样:
  1. gawk "BEGIN{RS=\"id=tos\"}/./{print RS $0}" a.txt
复制代码
  1. gawk "BEGIN{RS=\"id=tos\"}$1~sub(/^/,RS)" a.txt
复制代码
也可以这样:
  1. gawk -F"id=tos" "{for(i=2;i<=NF;i++)print FS $i RS}" a.txt
复制代码
用四楼的正则就是这样:
  1. gawk "gsub(/id=tos/,\"\n^&\")" a.txt
复制代码
  1. gawk "$0=gensub(/\s(id=tos)/,\"\n\\1\",\"g\")" a.txt
复制代码
也可用域赋值技巧:
  1. gawk -F"id=tos" "{OFS=RS FS;$1=$1;print}" a.txt
复制代码
简写:
  1. gawk -F"id=tos" "OFS=RS FS ($1=$1)" a.txt
复制代码

TOP

本帖最后由 Linuxer 于 2014-7-29 14:38 编辑

回复 7# DAIC


    请教一下,为什么我测试这个代码,没有达到效果呢。执行后,就相当于把id=tos变成nid=tos
我是在win下使用的,GNU sed version 3.02,,是版本的低的原因吗?

TOP

回复 10# Linuxer


    试试4.2.2这个版本

TOP

回复 11# DAIC


    多谢,,刚刚从你签名找过去了,更新了4.2.2版本,发现真的生效了。。看来就是版本低的原因啊。

TOP

返回列表