使用Sed在<之间提取数据和>

时间:2016-02-25 14:37:36

标签: awk sed grep

我收到了以下sed命令:

sed "s/^[^<]*<//;s/>[^<]*</,/g;s/>.*$//" CmcComRouting.log > PTChuteLog2.log

适用于在<>之间提取数据。

160218 003034 0053 DE(N) RoutingIfCmc1.cmccom TX: Tlg=<tlgNo=<0014: ItemIdTlg>, length=<5>, cmcIndex=<942>, itemId=<13983804>, globalId=<13983804>>

但是,我想保留的是日期和时间部分的前半部分:

160218 003034

有没有办法使用sedgrepawk执行此操作来保留第一部分,在<>之间提取所有内容并在每个部分之间添加逗号场?

2 个答案:

答案 0 :(得分:1)

我修改了命令如下:

$ sed 's/^\([0-9]* [0-9]* \)[^<]*<[^<]*</\1/;s/>[^>]*>[^>]*$//;s/>[^<]*</,/g' <<< "$var"
160218 003034 0014: ItemIdTlg,5,942,13983804,13983804

首先,该命令在<{1}}之间而不是正确提取。所有其他对周围都有一对尖括号,前一个命令的行为如下:来自

之类的数据
<>

它会提取

xyz <something<a>blah<b>something> xyz

为了解决这个问题,我将第一个命令修改为

something<a,b

和相应的最后一个命令

s/^[^<]*<[^<]*<//

最后一个命令实际上按原样运行,但是有一个贪婪的匹配 - 这一个更受控制。

要提取第一个数字序列,第一个命令必须捕获它们:

s/>[^>]*>[^>]*$//

所以,总而言之,你有(更具可读性)

s/^\([0-9]* [0-9]* \)[^<]*<[^<]*</\1/

答案 1 :(得分:0)

这可能是你想要的:

$ cat tst.awk
{
    printf "%s,%s", $1, $2
    while ( match($0,/<[^<>]+>/) ) {
        printf ",%s", substr($0,RSTART+1,RLENGTH-2)
        $0 = substr($0,RSTART+RLENGTH)
    }
    print ""
}

$ awk -f tst.awk file
160218,003034,0014: ItemIdTlg,5,942,13983804,13983804

但是如果没有您向我们展示您问题中的预期输出,我们只是在猜测。