我试图将tshark输出插入MySQL数据库。 Tshark输出格式为:
VALUE1:VALUE2_1|VALUE2_2|VALUE2_3:VALUE3_1,VALUE3_2,VALUE3_3:VALUE4:VALUE5
目前我正试图通过管道将输出重定向到sed和awk:
|sed -u "s/^/insert into data (item1, item2, item3, item4, item5) values('/g"|awk -F":" -v OFS=',' '{print $1,$2}'
,但只需要一些值。
这样生成的命令必须如下所示:
insert into data (item1, item2, item3, item4, item5) values(value1,value2_2,value3_2,value4,value5)
来自开发环境的一些例子:
Tshark永久产生这些输出:
1418043291.268345000:14567744356|4|8v95489464:DC0289001840,NNN100,DC206286661:03612037:ON1774B01
1418043291.201703000:14567744356|0|6b10992051:DC0289001840,NNN120,DC081276320:04891241:ON891N619
,其中
对于VALUE2和VALUE3只对中间行感兴趣,即" 4"对于VALUE2和" NN100"对于VALUE3。这些值中的所有其他行(VALUE2,VALUE3)对于从外侧进行的进一步计算不是必需的,这就是为什么必须丢弃它们并且生成的insert命令必须如下所示:
insert into data (item1, item2, item3, item4, item5) values(1418043291.268345000,4,NNN100,03612037,ON1774B01)
请告知,如何修改用于插入值的awk命令:
VALUE1:VALUE2_2:VALUE3_2:VALUE4:VALUE5 ?
答案 0 :(得分:0)
基于您的样本,解释和简化而且没有awk(在这种情况下不需要,而且操作系统更重)
sed 's/\([^:]*\):[^|]*|\([^|]*\)|[^,]*,\([^,]*\),[^:]*:\([^:]*\):\(.*\)/insert into data (item1, item2, item3, item4, item5) values(\1,\2,\3,\4,\5)/' YourFile
(在GNU sed上的posix版本--posix
)
真正的完整结构是使用完整值和子组:
sed 's/\([^:]*\):\([^|]*|\([^|]*\)|^[^:]*\):\([^,]*,\([^,]*\),[^:]*\):\([^:]*\):\(.*\)/insert into data (item1, item2, item3, item4, item5) values(\1,\3,\5,\6,\7)/' YourFile
现在,只有awk也是可能的,sed后跟awk是为了避免(通常是可能的)性能和资源的观点