我收到了以下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
有没有办法使用sed
,grep
或awk
执行此操作来保留第一部分,在<>
之间提取所有内容并在每个部分之间添加逗号场?
答案 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
但是如果没有您向我们展示您问题中的预期输出,我们只是在猜测。