2015-12-21 46 views
0

我必须阅读大文件并查找FamlyType的出现次数。有一次,我发现,我需要分配faimlytype部旗下有我需要的变量赋值为我做进一步的测试数据点的数量在什么样的..Awk Sed查找并将结果分配给多个变量

FamilyType 

FamilyKind    String  G 
userName:    String:  MATT_HANS 
serviceList:   String:   H2O 
hostList:    String:  159.220.108.80 
protocol:    String:   UDP 
portNumber:    Numeric:  8149 
port:     String:  TCPIP 


FamilyType 

FamilyKind    String  f 
userName:    String:  Geroge_lucas 
serviceList:   String:  WWW 
hostList:    String:  159.220.108.70 
protocol:    String:  TCP 
portNumber:    Numeric: 8166 
port:     String:  TCPIP 

,所以我需要写一个在我的剧本找到Familtype例程然后分配用户名& servicelist & hoslist和portNumebrto变量 所以结果应该是

请注意,有很多领先的空间的每一个变量

userName1="MATT_HANS" 
serviceList1="H2O" 
hostList1:"159.220.108.80" 
portNumber1="8149" 

userName2="Geroge_lucas" 
serviceList2="WWW" 
hostList2:"159.220.108.70" 
portNumber2="8166" 

我正在使用Bounre shell/Bash
是否有可能让用户sed或awk在一次运行中执行此操作?如果您提供任何帮助,请解释命令;所以我可以在将来使用它

+4

对不起,但StackOverflow不是免费的编码服务。预计你会写出你自己的代码。当你卡住了,你可以在你的Q中显示你的输入,所需的输出,代码,当前输出和错误信息,然后我们可以帮助你。你至少有输入和所需的输出,所以...你在中途。祝你好运。 – shellter

+0

是的 - 我明白了 - 我真的不知道从哪里开始我之前没有做过这样的事情 - 但是,谢谢你的回复 – theuniverseisflat

+0

这没什么帮助 - 但我会看到我可以谷歌。 – theuniverseisflat

回答

3

awk来救援!

$ awk -v q="\"" '/FamilyType/{f=1} 
    f && /userName|serviceList|hostList|portNumber/ 
        {sub(":","1=",$1); 
        print $1 q $3 q 
        } 
      /port:/{f=0;print ""}' file 

userName1="MATT_HANS" 
serviceList1="H2O" 
hostList1="159.220.108.80" 
portNumber1="8149" 

userName1="Geroge_lucas" 
serviceList1="WWW" 
hostList1="159.220.108.70" 
portNumber1="8166" 

ps。你的hostList具有“:”符号,这将所有东西都转换成“=”符号。如果不是拼写错误,您需要专门处理它,但我没有看到它的需要。

更新:为变量后缀设置增量计数器。

$ awk -v q="\"" '/FamilyType/{f=1;c++} 
    f && /userName|serviceList|hostList|portNumber/ 
          {sub(":",c"=",$1); 
           print $1 q $3 q 
          } 
         /port:/{f=0;print ""}' file 

userName1="MATT_HANS" 
serviceList1="H2O" 
hostList1="159.220.108.80" 
portNumber1="8149" 

userName2="Geroge_lucas" 
serviceList2="WWW" 
hostList2="159.220.108.70" 
portNumber2="8166" 
+0

非常感谢。您的命令适用于以上输入。在我的文件中,我在变量前有空格,所以我得到了很多其他数据。你能摆脱领先的空间吗?不知道为什么它鼻涕工作saisnt我的文件 – theuniverseisflat

+0

也变量的第二个输出应分配到2?不是一个否则这个被覆盖 – theuniverseisflat

+0

请确保您的输入/输出代表您的实际数据(尽管简化)。 – karakfa

相关问题