使用awk格式化

时间:2015-03-13 10:08:40

标签: bash shell printing awk substr

有点awk的初学者并且希望有人可以指出我出错的地方..

我试图在脚本中运行awk并更改匹配" objectID"

的特定字符串的格式

这是源数据:

name=SDC1NM519
  capacityInKB=1,341,231,104
  osType=Windows
      objectID=LU.R700.53280.24580
      displayName=00:60:04
      capacityInKB=1,048,576
      consumedCapacityInKB=43,008
      dpPoolID=10
      objectID=LU.R700.53280.24584
      displayName=00:60:08
      capacityInKB=1,335,885,824
      consumedCapacityInKB=375,588,864
      dpPoolID=10

这是我的问题:

awk '/name/
/osType/
/objectID=LU {print "objectID=" substr ($1,18,5) }/ 
/displayName/
/capacityInKB/
/consumedCapacityInKB/
/dpPoolID/' rawdata.txt >> objtxt

我希望看到的内容如下所示,对象ID已更改为仅显示" 53280"。是的,号码始终采用相同的格式,但号码不同:

name=SDC1NM519
  capacityInKB=1,341,231,104
  osType=Windows
      objectID=53280
      displayName=00:60:04
      capacityInKB=1,048,576
      consumedCapacityInKB=43,008
      dpPoolID=10

我得到的是......根本没有任何对象...... ??

name=SDC1NM519
  capacityInKB=1,341,231,104
  osType=Windows
      displayName=00:60:04
      capacityInKB=1,048,576
      consumedCapacityInKB=43,008
      dpPoolID=10

任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:1)

您没有看到objectID行,因为awk无法找到匹配项

/objectID=LU {print "objectID=" substr ($1,18,5) }/

斜杠分隔只是正则表达式,而不是整行。使用此

/objectID=LU/ {print "objectID=" substr ($1,18,5) }

/objectID=LU/ {split($0, a, "."); print "objectID=" a[3]}

awk程序由expression {action}对列表组成。

  • 如果expression不存在,默认情况下为“true”
  • 如果{action}不存在,默认为{print}
  • 如果表达式的计算结果为“true”,则执行操作

答案 1 :(得分:1)

如果您只想显示objectId行,请更改您的:

/objectID=LU {print "objectID=" substr ($1,18,5) }/

/objectID=LU/ {print "objectID=" substr ($1,18,5) }

但是这会破坏格式(缺少缩进)。

要保留缩进,您可以执行以下操作:

/objectID=LU/&&sub(/=.*/,"="substr($1,18,5))