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

时间:2017-11-17 00:13:30

标签: bash awk grep

我有一个这样的示例文件:

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代码吗?

2 个答案:

答案 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 ...已替换为stuff1stuff2等。

  • ^\([+-rd]\)保存第一个字符,如果它是捕获组1中的+-rd之一,
  • [ ]*跳过任意数量的空格
  • \([0-9.]*\)在捕获组2中保存0-9.的序列,
  • [^0-9]*跳过任何不是0-9
  • 的内容
  • \([0-9]\)捕获捕获组3中的下一个数字
  • .*$跳过剩余的字符
  • /Node\3 \1 \2/替换显示的顺序中的反向引用
  • p打印出来。

尝试一下,让我知道它是否正在做你需要的东西。