我需要处理以下数据,以便处理以curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
开头且以<SUBBEGIN
结尾的每个数据块。
<SUBEND
我已经使用过这个linux命令了:
<SUBBEGIN
AARB:28E5A4ERR
SUBSCRIBERIDENTIFIER:234810128
GBRUL:0
GBRDL:0
SUBSCRIPTION:5093201&733D8E01CA&1&FFFFFFFFFFFFFF&20160729121530&FFFFFFFFFFFFFF&2&1&FFFFFFFFFFFFFFFF&255&0&255&256&FFFFFFFFFFFFFFFF&0&0&128&1
SUBSCRIPTION:5233555&733D8E01CA&1&FFFFFFFFFFFFFF&20160730091530&FFFFFFFFFFFFFF&2&1&FFFFFFFFFFFFFFFF&255&0&255&256&FFFFFFFFFFFFFFFF&0&0&128&1
QUOTA:5093201&733D8201D10D270D&1&1&0&1&20171121043000&20171221043000&0&255&0&0&0&0&0&0&0&0&0
QUOTA:5233555&633D8201D10D270D&1&1&0&1&20171121043000&20171221043000&0&255&0&0&0&0&0&0&0&0&0
ONLINESTATUS:2
LATEST_ONLINE_TIME:20170330191209
CREATETYPE:0
MAXOFFLINEDAYS:0
<SUBEND
<SUBBEGIN
BBRB:28E5A4ETT
SUBSCRIBERIDENTIFIER:234825528
GBRUL:0
GBRDL:0
SUBSCRIPTION:5093333&733D8E01CA&1&FFFFFFFFFFFFFF&20160729121530&FFFFFFFFFFFFFF&2&1&FFFFFFFFFFFFFFFF&255&0&255&256&FFFFFFFFFFFFFFFF&0&0&128&1
QUOTA:5093264&733D8201D10D270D&1&1&0&1&20171121043000&20171221043000&0&255&0&0&0&0&0&0&0&0&0
ONLINESTATUS:2
LATEST_ONLINE_TIME:20170330191209
CREATETYPE:0
MAXOFFLINEDAYS:0
<SUBEND
<SUBBEGIN
CCRB:28E5A4ESS
SUBSCRIBERIDENTIFIER:234993527
GBRUL:0
GBRDL:0
SUBSCRIPTION:5093264&733D8E01MB&1&FFFFFFFFFFFFFF&20160729121530&FFFFFFFFFFFFFF&2&1&FFFFFFFFFFFFFFFF&255&0&255&256&FFFFFFFFFFFFFFFF&0&0&128&1
SUBSCRIPTION:9093201&733D8E01CA&1&FFFFFFFFFFFFFF&20160729121530&FFFFFFFFFFFFFF&2&1&FFFFFFFFFFFFFFFF&255&0&255&256&FFFFFFFFFFFFFFFF&0&0&128&1
SUBSCRIPTION:6598777&733D8E01CA&1&FFFFFFFFFFFFFF&20160730091530&FFFFFFFFFFFFFF&2&1&FFFFFFFFFFFFFFFF&255&0&255&256&FFFFFFFFFFFFFFFF&0&0&128&1
QUOTA:5093264&733D8201D10D270D&1&1&0&1&20171121043000&20171221043000&0&255&0&0&0&0&0&0&0&0&0
QUOTA:9093201&733D8201D10D270D&1&1&0&1&20171121043000&20171221043000&0&255&0&0&0&0&0&0&0&0&0
QUOTA:6598777&633D8201D10D270D&1&1&0&1&20171121043000&20171221043000&0&255&0&0&0&0&0&0&0&0&0
ONLINESTATUS:2
LATEST_ONLINE_TIME:20170330191209
CREATETYPE:0
MAXOFFLINEDAYS:0
<SUBEND
但是我得到了行的结果,而我需要它在下面的列中(请将下面的期望复制到ultredit程序以查看完整长度):
grep -e SUBSCRIBERIDENTIFIER -e SUBSCRIPTION -e QUOTA
请帮帮忙。
答案 0 :(得分:2)
尝试:
$ awk -F'&' '{sub(/^[[:blank:]]+/,"")} /SUBSCRIBERIDENTIFIER/{id=$1} /SUBSCRIPTION/{s=s","$1} /QUOTA/{q=q","$1} /SUBEND/{print id,s,q; id=""; s=""; q=""}' data | column -t | tr , ' '
SUBSCRIBERIDENTIFIER:234810128 SUBSCRIPTION:5093201 SUBSCRIPTION:5233555 QUOTA:5093201 QUOTA:5233555
SUBSCRIBERIDENTIFIER:234825528 SUBSCRIPTION:5093333 QUOTA:5093264
SUBSCRIBERIDENTIFIER:234993527 SUBSCRIPTION:5093264 SUBSCRIPTION:9093201 SUBSCRIPTION:6598777 QUOTA:5093264 QUOTA:9093201 QUOTA:6598777
-F'&'
这告诉awk使用&
作为字段分隔符。
sub(/^[[:blank:]]+/,"")
这将删除每一行的所有前导空格。
/SUBSCRIBERIDENTIFIER/{id=$1}
这会将SUBSCRIBERIDENTIFIER信息保存在变量id
中。
/SUBSCRIPTION/{s=s","$1}
这会在变量s
中以逗号分隔格式保存所有SUBSCRIPTION信息。
/QUOTA/{q=q","$1}
这会在变量q
中以逗号分隔格式保存所有QUOTA信息。
/SUBEND/{print id,s,q; id=""; s=""; q=""}
每当我们到达SUBEND时,我们会打印出一行数据并重置所有变量
column -t
这将输出数据格式化为列。
tr , ' '
这会从输出中删除逗号。
根据您的评论,您使用的文件名称为UPCC_5_20171124144300_0_huabiao1_601.txt
,并且您希望将结果附加到文件Result.txt
中。在这种情况下,运行:
awk -F'&' '{sub(/^[[:blank:]]+/,"")} /SUBSCRIBERIDENTIFIER/{id=$1} /SUBSCRIPTION/{s=s","$1} /QUOTA/{q=q","$1} /SUBEND/{print id,s,q; id=""; s=""; q=""}' UPCC_5_20171124144300_0_huabiao1_601.txt | column -t | tr , ' ' >>Result.txt
请注意,此处不需要cat
命令。
答案 1 :(得分:2)
使用 awk
$ awk -F"&" '/^<SUBBEGIN$/{a=1} a && /^[[:blank:]]+(SUBSCRIBERIDENTIFIER|SUBSCRIPTION|QUOTA)/{l=l OFS $1} a && /^<SUBEND$/ {print l; a=l=""}' f1
SUBSCRIBERIDENTIFIER:234810128 SUBSCRIPTION:5093201 SUBSCRIPTION:5233555 QUOTA:5093201 QUOTA:5233555
SUBSCRIBERIDENTIFIER:234825528 SUBSCRIPTION:5093333 QUOTA:5093264
SUBSCRIBERIDENTIFIER:234993527 SUBSCRIPTION:5093264 SUBSCRIPTION:9093201 SUBSCRIPTION:6598777 QUOTA:5093264 QUOTA:9093201 QUOTA:6598777
/^<SUBBEGIN$/{a=1}
:如果记录为<SUBBEGIN
,则设置标记a
,标记块的开头
a && /^[[:blank:]]+(SUBSCRIBERIDENTIFIER|SUBSCRIPTION|QUOTA)/{l=l OFS $1}
:如果设置了a
并且记录与您在原始问题中指定的单词之一匹配,则将记录追溯到第一个字段到变量l
(注意:{{1 }})
FS="&"
:如果设置了a && /^<SUBEND$/ {print l; a=l=""}'
并且达到了块结束,则重置所有变量。