给定一个包含各种内容的数据文件,我想首先忽略任何不以 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
(可能有更好的方法来做到这一点!)