【发布时间】:2021-07-21 02:46:52
【问题描述】:
我认为这个问题之前已经回答过,但我一直无法找到满足这一特定需求的问题。
在使用 AWK 搜索约 150mb 的以太网数据包文本文件以查找 csv(或文本)文件中的列表中出现的字符串时,我遇到了困难。其中一个问题似乎是数据文件中的前导空格以及数据文件中冒号后面的信息。
我想在数据文件中搜索 $1 中的术语“Epoch”。这将在每一帧中,然后在列表文件中搜索在 $1 中下一次出现“Epoch”之前找到的任何术语,如果找到它们,则打印 ($3/86400+25569)(将其格式化为工作使用 Excel 时间格式)从“Epoch”行开始,然后是列表文件中的任何匹配项,以逗号 (,) 分隔。
列表文件如下所示
bill_more_data:
and_more_data:
pay_hour:
age_years:
favorite_adventure_type:
数据文件如下所示。
No. Time Source Destination
1 0.000000 xxx.xx.xxx.x xxx.xx.xxx.x
Frame 1: 52 bytes on wire (100 bits), 22 bytes captured (757 bits)
Arrival Time: Jun 28, 2021 04:17:23.747890000 Pacific Daylight Time
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1624879043.747890000 seconds
[Time delta from previous captured frame: 0.000000000 seconds]
Frame Number: 1
Ethernet II, Src: xxxxxxxxxxxxxx (xxx:xxx:xx:xx:xx:xx:x), Dst: xxx:xxx:xx:xx:xx:xx:x (xxx:xxx:xx:xx:xx:xx:x)
Destination: xxx:xxx:xx:xx:xx:xx:x (xxx:xxx:xx:xx:xx:xx:x)
Address: xxx:xxx:xx:xx:xx:xx:x (xxx:xxx:xx:xx:xx:xx:x)
.... .... .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)
.... .... .... .... .... .... = IG bit: Individual address (unicast)
Internet Protocol Version 4, Src: xxx.xx.xxx.x, Dst: 000.00.00.00
Flags: 0x0, Don't fragment
0... .... = Reserved bit: Not set
Info Header
message_id: 000x00
message_length: 2
bill_some_data
bill_that_data: 0
bill_more_data: 1
and_more_data: 0
0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
No. Time Source Destination
2 0.000275 xxx.xx.xxx.x xxx.xx.xxx.x
Frame 2: 60 bytes on wire (454 bits), 55 bytes captured (454 bits)
Arrival Time: Jun 28, 2021 04:17:23.748165000 Pacific Daylight Time
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1624879043.748165000 seconds
[Time delta from previous captured frame: 0.000275000 seconds]
Frame Number: 2
Ethernet II, Src: xxx:xxx:xx:xx:xx:xx:x (xxx:xxx:xx:xx:xx:xx:x), Dst: xxx:xxx:xx:xx:xx:xx:x (xxx:xxx:xx:xx:xx:xx:x)
Destination: xxx:xxx:xx:xx:xx:xx:x (xxx:xxx:xx:xx:xx:xx:x)
Address: xxx:xxx:xx:xx:xx:xx:x (xxx:xxx:xx:xx:xx:xx:x)
.... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Internet Protocol Version 4, Src: 172.28.1.72, Dst: 172.28.1.30
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Flags: 0x00
0... .... = Reserved bit: Not set
.0.. .... = Don't fragment: Not set
..0. .... = More fragments: Not set
Fragment Offset: 0
[Stream index: 1]
Info Header
message_id: 0x00000
message_length: 5
TED_name
pay_hour: 3.25
vacation_days: 0
age_years: 22
time_in_role: 0.1
favorite_adventure_type: excellent
我尝试了以下方法,但没有得到任何输出。如果我更改列表文件以包含冒号后的信息,那么它至少会打印这些行,但这对我没有多大好处。
awk 'NR==FNR{a[$1]++;next}a[$1]' list.txt data.txt
期望的输出
44375.4704137487,bill_more_data,1,bill_more_data,1
1624879043.748165000,pay_hour,3.25,age_years,22,favorite_adventure_type,excellent
或更好地使用格式化为在 Excel 中工作的纪元时间
44375.4704137487,bill_more_data,1,bill_more_data,1
44375.4704137518,pay_hour,3.25,age_years,22,favorite_adventure_type,excellent
我尝试了其他几种方法,但效果有限。我正在寻找一种优雅的方式来做到这一点,它还能够以记录这些值的方式处理未来对格式的更改。我尝试的其他方法之一是运行几个 AWK 命令首先反转文件,然后搜索列表项并打印它们,然后搜索下一个出现或“Epoch”并打印 $3,然后再次反转文件,然后另一个 AWK 打印任何不是“Epoch”的行。如果我直接在命令本身中输入列表项,这似乎工作正常,但如果我试图从另一个文件中读取,我无法让它工作。
在此先感谢您提供任何帮助。这是我第一次使用 AWK,所以如果我问了一个愚蠢的问题,请原谅我。
【问题讨论】:
-
您尝试的根本问题是它一次检查一行。您希望将第二个文件拆分为多行记录,然后在每个记录中搜索您的字符串。我猜每条记录的第一行是
No. Time Source行,因此您可以将其提供为RS。 (空间在 cmets 中被压缩,但我相信你可以猜到我在看什么。) -
很好的第一个问题 - 明确的要求、简洁、可测试的样本输入和预期输出,并尝试自己解决问题!
标签: awk