我有一个这样的示例文件:
r 2.1238 / NodeList / 1 / DeviceList / 1 /(type = 0x806,source = 00:00,destination = ff: ff)ns3 :: IPv4Header (源ipv4:10.1.2.1 dest ipv4:10.1.2.4)
+ 2.0076 / NodeList / 0 / DeviceList / 1 /(type = 0x806,source = 00:00,destination = ff: ff)ns3 :: ArpHeader (源ipv4:10.1.2.1 dest ipv4:10.1.2.4)
- 2.0077 / NodeList / 1 / DeviceList / 1 /(type = 0x806,source = 00:00,destination = ff: ff)ns3 :: IPv4Header (源ipv4:10.1.2.1 dest ipv4:10.1.2.4)
d 4.0042 / NodeList / 2 / DeviceList / 1 /(type = 0x806,source = 00:00,destination = ff: ff)ns3 :: IPv4Header (源ipv4:10.1.2.1 dest ipv4:10.1.2.4)
等等。
大胆的部分是重要的领域。第一个字段可以是' - ',' +',' r'或者' d。第二个字段有一个时间戳,以粗体显示。第三个字段是节点号,再次以粗体显示。节点编号指的是要打印前两个字段的文件。
限制是我只想要包含 IPv4Header 的那些行的数据,例如。以上样本中的第1,第3和第4行。
所以,我希望我的输出像:
Node0.txt: + 2.0076
Node1.txt: r 2.1238 - 2.0077
正如您所看到的那样,第2行中的Node0被拒绝,因为它不包含 IPv4Header 。我们可以看到生成的输出文件数等于 IPv4Header 的节点数。
假设不同文件的行数和节点数是多个且可变的。有人可以给我提供必要的grep代码吗?
答案 0 :(得分:1)
awk
救援!
$ awk -F/ '/IPv4Header/{print $1 > "Node" $3 ".txt" }' file
应该创建两个内容为
的文件Node1.txt: r 2.1238
- 2.0077
Node2.txt: d 4.0042
请注意,Node0
不会按照您的定义创建。
答案 1 :(得分:0)
您实际需要的是sed
。例如,使用sed
您可以执行以下操作:
$ sed -n '/IPv4Header/s/^\([+-rd]\)[ ]*\([0-9.]*\)[^0-9]*\([0-9]\).*$/Node\3.txt \1 \2/p' file
Node1.txt r 2.1238
Node1.txt - 2.0077
Node2.txt d 4.0042
其中
sed -n
会抑制正常的outoput,/IPv4Header/
仅查找包含IPv4Header
以下标准sed
替代s/match/replace/
以下match
使用捕获群\(stuff\)
保存stuff
以便replace
使用<{1}} em> backreferences 其中\1
,\2
...已替换为stuff1
,stuff2
等。
^\([+-rd]\)
保存第一个字符,如果它是捕获组1中的+-rd
之一,[ ]*
跳过任意数量的空格\([0-9.]*\)
在捕获组2中保存0-9
和.
的序列,[^0-9]*
跳过任何不是0-9
,\([0-9]\)
捕获捕获组3中的下一个数字.*$
跳过剩余的字符/Node\3 \1 \2/
替换显示的顺序中的反向引用p
打印出来。尝试一下,让我知道它是否正在做你需要的东西。