首页 > 解决方案 > 不能对 AWK 使用 OR

问题描述

我有一个简短的脚本来搜索文本文件中的设备

示例数据库(inv.txt):

Rack:  RG01
Rack_units:  U11-U12
Serial:  10101NH
Name: Test01
Firmware:  v1.01

Rack:  RG05
Rack_units:  U12-U13
Serial:  10893NE
Name: Test02
Firmware:  v1.02

Rack:  RK11
Rack_units:  U14-U15
Serial:  10234JH
Name: Test03
Firmware:  v1.01

[...]

这是我的代码:

#!/usr/bin/awk -f
/^Rack:/ {
  inStanza = 1;
  delete keep
  idx = 0
}
inStanza {
  keep[++idx] = $0
}
/^Serial:/ { if ($0 ~ find) { matched = 1; } else { matched = 0; } }
/^Firmware:/ && matched {
  for(i=1;i<=idx;i++) print keep[i]
  matched = 0;
  inStanza = 0
}

我想用Serial:and搜索Rack:,例如:

 ➜ ./search.awk -v find=RG01 inv.txt
Rack:  RG01
Rack_units:  U11-U12
Serial:  10101NH
Name: Test01
Firmware:  v1.01

但现在它只适用于Serial:. 我不知道该怎么做。我尝试使用OR,但它对我不起作用

1. $1~/^(Serial:|Rack:)/ { if ($0 ~ find) { matched = 1; } else { matched = 0; } }
2. ($1 ~ /^Serial:/ || $1 ~ /^Rack:/) { if ($0 ~ find) { matched = 1; } else { matched = 0; } }
3. (/^Serial:/ || /^Rack:/) { if ($0 ~ find) { matched = 1; } else { matched = 0; } }

有任何想法吗?

标签: linuxawk

解决方案


您尝试的问题是,如果不匹配,它会破坏该matched值。Serial:因此,您想重构以仅matched在尚未为此记录设置时进行更改。

awk -v find="RG01" '
/^Rack:/ {
  inStanza = 1;
  delete keep
  idx = 0
}
inStanza {
  keep[++idx] = $0
}
/^(Rack|Serial):/ && !matched { matched = ($0 ~ find) }
/^Firmware:/ && matched {
  for(i=1;i<=idx;i++) print keep[i]
  matched = 0;
  inStanza = 0
}' inv.txt

演示:https ://ideone.com/RL9S7L


推荐阅读