AWK有多个分隔符

时间:2014-12-15 11:01:48

标签: mysql awk sed tshark

我试图将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 

,其中

  1. 1418043291.268345000 - VALUE1
  2. 14567744356 | 4 | 8v95489464 - VALUE2
  3. DC0289001840,NNN100,DC206286661 - VALUE3
  4. 03612037 - VALUE4
  5. ON1774B01 - VALUE5
  6. 对于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 ? 
    

1 个答案:

答案 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是为了避免(通常是可能的)性能和资源的观点