根据此数据:
"STRING1","c45621396a774a7a79b095a1b73b1d3b","2016-04-14T19:39:41.529978","1.0.4.4","7-sp1.0-amd64","","10.224.241.219|0.0.0.0|0.0.0.0|192.168.0.6|0.0.0.0"
"STRING2","c5815139f3051de2ab67909b03a01203","2016-04-14T19:37:47.991569","1.0.4.4","7-sp1.0-amd64","","10.230.16.188"
"STRING3","c837513923e2abfe4df41c2240d1c869","2016-04-14T19:40:10.385759","1.0.4.4","7-sp1.0-amd64","","0.0.0.0|0.0.0.0|0.0.0.0|10.226.41.43"
"STRING4","c837544923e2abfe4df41c2240d1c869","2016-04-14T19:40:10.385779","1.0.4.4","7-sp0.0-amd64","","8.8.8.8|0.0.0.0|0.0.0.0|0.0.0.0|10.226.41.43"
"STRING5","c837544003e2abfe4df41c2240d1c869","2016-04-14T19:40:10.382379","1.0.4.4","7-sp0.0-amd64","","0.0.0.0|10.20.40.6|0.0.0.0|10.226.41.43"
我只想保留
根据以下示例,这是所需的输出:
STRING1 10.224.241.219
STRING2 10.230.16.188
STRING3 10.226.41.43
STRING4 10.226.41.43
STRING5 10.20.40.6 10.226.41.43
可以达到此目的的sed / awk魔术是什么?我可以在GNU / Linux系统或cygwin上使用任何标准的文本处理工具来实现此目的。
谢谢
如果您的字段从不包含逗号,则可以尝试:
$ perl -F, -lane '@k=split(/["|]/,$F[6]);
@l=grep{/^10\./}@k;
print "$F[0] @l"' file |
sed 's/"//g'
STRING1 10.224.241.219
STRING2 10.230.16.188
STRING3 10.226.41.43
STRING4 10.226.41.43
STRING5 10.20.40.6 10.226.41.43
Perl的-a
选项使它像这样工作awk
,它将输入的文件拆分为给定的值-F
,并将每个结果字段另存为数组中的元素@F
。因此,第一个字段将是$F[0]
,第二个字段$F[1]
等。该-l
选项向每个print
调用添加换行符,并-n
告诉告诉perl
一行一行地读取其输入文件,并将由-e
给定的脚本应用于每一行。
@k=split(/["|]/,$F[6]);
:分割"
或上的第7个字段|
,并将其另存为数组@k
。这将是IP。@l=grep{/^10\./}@k;
:@k
将以a开头的所有字段保存10
在数组中@l
。print "$F[0] @l"
:打印第一个字段以及其中的任何内容@l
。sed 's/"//g'
:删除引号。由于perl
将在运行其他任何操作之前先分割输入行,因此使用其他程序更容易。您还可以通过不使用临时数组变量来缩短Perl脚本:
perl -F, -lane 'print "$F[0] ", join " ", grep{/^10\..*/} split(/["|]/,$F[6])' file
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句