Bash 使用grep在条件下从字符串中提取特定单词,并将其打印到变量文件名中
我有这样一个示例文件: r2.1238/NodeList/1/DeviceList/1/(type=0x806,source=00:00,destination=ff:ff)ns3::ipv4标头(source 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(source 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::ipv4头文件(source ipv4:10.1.2.1 dest ipv4:10.1.2.4) d4.0042/NodeList/2/DeviceList/1/(type=0x806,source=00:00,destination=ff:ff)ns3::ipv4标头(source 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行中的节点0被拒绝,因为它不包含IPV4标头。正如我们所看到的,生成的输出文件的数量等于具有IPv4Header的节点的数量Bash 使用grep在条件下从字符串中提取特定单词,并将其打印到变量文件名中,bash,awk,grep,Bash,Awk,Grep,我有这样一个示例文件: r2.1238/NodeList/1/DeviceList/1/(type=0x806,source=00:00,destination=ff:ff)ns3::ipv4标头(source 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(source ipv4:10.1.2.1
假设不同文件的行数和节点数是多个且可变的。有人能给我提供必要的grep代码吗?你实际上要找的是
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
仅查找包含/IPv4Header/
IPv4Header
sed
substitutes/match/replace/
其中match
使用捕获组\(stuff\)
保存stuff
,以便在replace
中使用\1
,\2
。。。替换为stuff1
,stuff2
等
如果第一个字符是捕获组1中的^\([+-rd]\)
之一,请保存该字符+-rd
跳过任意数量的空格[]*
保存捕获组2中\([0-9.]*\)
和0-9
的序列
跳过任何非[^0-9]*
0-9
捕获捕获组3中的下一个数字\([0-9]\)
跳过剩余字符*$
按所示顺序替换为反向引用/Node\3\1\2/
打印它p
试试看,让我知道它是否在做你需要的事情。
awk
救命
$ awk -F/ '/IPv4Header/{print $1 > "Node" $3 ".txt" }' file
应该创建两个包含内容的文件
Node1.txt: r 2.1238
- 2.0077
Node2.txt: d 4.0042
请注意,
Node0
不会按照您的定义创建。我希望将结果输出到节点的相应文本文件(名为Node0.txt、node1.txt等)。这可能吗?使用bash而read-r name rest;执行echo“$rest”>>“$name.txt”;完成<注意:在我编辑答案后,您可以在上面的评论中使用“$name”
,在NodeX
之后添加'.txt'
?为什么您没有node2d4.0042
?为什么您不自己尝试解决这个问题,然后就解决方案中存在问题的部分寻求帮助?StackOverflow不用于分发自定义解决方案。查看文档中关于好问题的提示。这当然很好,关于':“txt
之后的呢?”?我真的需要更多地使用awk
…这是一个测试工件,被删除了。