linux - 不能对 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; } }
有任何想法吗?
解决方案
您尝试的问题是,如果不匹配,它会破坏该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
推荐阅读
- c# - 调用 async EventHandler 的区别
- ruby-on-rails - 使用 find .where 后如何获取活动记录的名称
- java - Java Servlet 如何通过 Session 获取 UserId
- python - 如何使用pyaudio在macos上录制麦克风?
- flutter - 无法在 macOS Catalina 10.15.4 上安装 dart
- javascript - Html Webpack Plugin 呈现 JS 模块而不是 HTML 文件
- c++ - 如何将一个类的成员函数作为参数传递给另一个类的成员函数?
- reactjs - 使用 docker run 命令启动开发服务器后,React 脚本立即退出
- java - 从 SB 2.2.7 升级到 SB 2.3.0 后 Spring Boot 应用程序不会启动
- reactjs - 运行 Next.js 构建时未定义 Jest 引用错误“描述”