Awk AIX/KSH从逗号分隔的行中提取字符串

Awk AIX/KSH从逗号分隔的行中提取字符串,awk,substring,ksh,delimiter,aix,Awk,Substring,Ksh,Delimiter,Aix,我想从以下逗号分隔的行中提取部分“虚拟以太网适配器”: lpar_io_pool_ids=none,max_virtual_slots=300,"virtual_serial_adapters=0/server/1/any//any/1,1/server/1/any//any/1","virtual_scsi_adapters=166/client/1/ibm/166/0,266/client/2/ibm/266/0",virtual_eth_adapters=116/0/263,proc_mo

我想从以下逗号分隔的行中提取部分“虚拟以太网适配器”:

lpar_io_pool_ids=none,max_virtual_slots=300,"virtual_serial_adapters=0/server/1/any//any/1,1/server/1/any//any/1","virtual_scsi_adapters=166/client/1/ibm/166/0,266/client/2/ibm/266/0",virtual_eth_adapters=116/0/263,proc_mode=shared,min_proc_units=0.5,desired_proc_units=2.0,max_proc_units=8.0
我正在使用AIX和ksh

我找到了一个使用awk和-F标志的解决方法,用分隔符分隔字符串,然后打印项目ID。但是,如果输入字符串更改,ID可能会有所不同。

第一个解决方案:如果要在输出中打印字符串
虚拟以太网适配器,请尝试以下操作

awk '
match($0,/virtual_eth_adapters[^,]*/){
  print substr($0,RSTART,RLENGTH)
}
' Input_file
输出如下

virtual_eth_adapters=116/0/263
116/0/263


第二种解决方案:如果您只想打印字符串
虚拟以太网适配器的值,请尝试以下操作

awk '
match($0,/virtual_eth_adapters[^,]*/){
  print substr($0,RSTART+21,RLENGTH-21)
}
' Input_file
输出如下

virtual_eth_adapters=116/0/263
116/0/263
解释:添加代码解释

awk '                                        ##Starting awk program here.
match($0,/virtual_eth_adapters[^,]*/){       ##Using match function of awk here, to match from string virtual_eth_adapters till first occurrence of comma(,)
  print substr($0,RSTART,RLENGTH)            ##Printing sub-string whose starting value is RSTART and till value of RLENGTH, where RSTART and RLENGTH variables will set once a regex found by above line.
}
' Input_file                                 ##Mentioning Input_file name here.

我确实使用这些方法在行中间提取数据

awk -F'virtual_eth_adapters=' 'NF>1{split($2,a,",");print a[1]}' file
116/0/263
它简短易学。(无需计数或正则表达式)

  • -F'virtual\u eth\u adapters='
    通过
    virtual\u eth\u adapters=
  • NF>1
    如果有多个字段(行包含
    virtual\u eth\u适配器=
  • 拆分($2,a,“,”)
    将行的最后一部分拆分到数组
    a
    中,由
  • 打印a[1]
    打印数组的第一部分
    a
和另一种解决方案(假设字符串的位置)

如果只需要该值,请尝试以下操作:

awk -F\, '{print $7}'|awk -F\= '{print $2}'
也可以通过以下方式获取值:

awk -F\, '{split($7,a,"=");print a[2]}'

欢迎来到SO,是的,这可以在
awk
中完成,因此我们鼓励用户在发布问题的同时发布他们的努力,因此请您在您的帖子中添加您的努力,然后让我们知道。很好,您已经添加了您尝试的信息,请继续。我们鼓励用户自己添加代码,其中没有对错代码,因为我们都是来学习的,所以请您在问题中以代码的形式添加您的努力,谢谢您的回复!如果这篇文章听起来像是一个我很喜欢自言自语的人,我很抱歉。。我与awk有点僵持(见我的编辑)也许有更好的解决方案很高兴它帮助了你,在这个伟大的网站上继续分享和学习,所以,干杯,快乐学习。这很容易失败。如果有更多的行,或数据更改的地方。它的字段
#7
和非
#5
也是OP喜欢的。您很少需要使用两个
awk
。这样做:
awk-F\,“{split($7,a,”=”);打印[2]}'
以获得最后一个part@Jotne,使用
split
的想法很好,会将其添加到答案中。但是如果您有更多的行,脚本不会失败:)它将打印所有行的字段7,而不仅仅是带有
virtual_eth_适配器的字段7
谢谢您的解决方案!是否有可能扩展“搜索模式”?因此,我想选择属性“virtual_eth_adapters”和“virtual_scsi_adapters”。我试图用double | |或&&扩展“-F部分”。但我不知道是否可能有多个spilts。@ganisrc如果你喜欢两者都作为字段分隔符,这应该可以工作:
-F'virtual_eth_adapters=| virtual_scsi_adapters='som code'