Bash 使用grep在条件下从字符串中提取特定单词,并将其打印到变量文件名中

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

我有这样一个示例文件:

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的节点的数量


假设不同文件的行数和节点数是多个且可变的。有人能给我提供必要的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
substitute
s/match/replace/
其中
match
使用捕获组
\(stuff\)
保存
stuff
,以便在
replace
中使用
\1
\2
。。。替换为
stuff1
stuff2

  • ^\([+-rd]\)
    如果第一个字符是捕获组1中的
    +-rd
    之一,请保存该字符
  • []*
    跳过任意数量的空格
  • \([0-9.]*\)
    保存捕获组2中
    0-9
    的序列
  • [^0-9]*
    跳过任何非
    0-9
  • \([0-9]\)
    捕获捕获组3中的下一个数字
  • *$
    跳过剩余字符
  • /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
…这是一个测试工件,被删除了。