如何解析数据文件以提取特定数据和格式以供其他使用?

如何解析数据文件以提取特定数据和格式以供其他使用?

给定一个包含各种内容的数据文件,我想首先忽略任何不以 IP 地址开头的行,然后输出 IP 地址,后跟在大括号中找到的任何不包含符号的字符串=。任何给定的行可能有一个或多个字符串。

例如:

输入:

junk12  
junk34  
198.0.12.20 [ joker penguin character=villian ] blah  
198.0.13.20 [ super_man bat_man character=hero ] blah  
198.0.14.20 [ lois_lane character=damsel ] blah  
junk56  
junk78  

输出:

198.0.12.20 joker  
198.0.12.20 penguin  
198.0.13.20 super_man  
198.0.13.20 bat_man  
198.0.14.20 lois_lane  

答案1

可能有很多方法可以做到这一点,但awk我们可以做类似的事情

awk 'gsub(/^[0-9.]+ \[ /,$1 " ") { a=2; while (a<=NR && $a != "]") { if ($a !~ /=/) {print $1 " " $a } ; a++ } }'

让我们将其分解为更具可读性的内容:

gsub(/^[0-9.]+ \[ /,$1 " ") { .... }

这将匹配以数字和点开头,后跟空格和 的行[。所以会匹配10.20.30.40 [但不会匹配junk23。它将用第一个字段替换它,然后运行{...}​​.

所以一行像

198.0.12.20 [ joker penguin character=villian ] blah  

将进入该部分,看起来像

198.0.12.20 joker penguin character=villian ] blah  

现在是中间部分,如果我们把它写成多行,可能会更容易理解:

a=2;
while (a<=NR && $a != "]")
{
  if ($a !~ /=/) {print $1 " " $a }
  a++;
}

因此,我们从第二个字段(在本例中为“小丑”)开始并继续,直到我们用完单词或看到].对于我们找到的每个单词,如果它不包含 an,=那么我们将打印第一个字段(IP 地址)和该单词。

结果:

198.0.12.20 joker
198.0.12.20 penguin
198.0.13.20 super_man
198.0.13.20 bat_man
198.0.14.20 lois_lane

(可能有更好的方法来做到这一点!)

相关内容