这与awk print 2 line back if match有关,但由于我的命令存在我无法解决的缓冲问题,我认为更好的方法是完全忽略 stderr 并查找缺少某些行的输出。
所以我的输出将是:
Gathering drive descriptors ...
Gathering data for drive 0 ...
Drive Model: DataTraveler 2.0
Gathering data for drive 1 ...
Drive name: id1,sd@n5000cca17096
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp: 41 C
Gathering data for drive 2 ...
Drive name: id1,sd@n5000cca24156
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp: 41 C
Gathering data for drive 3 ...
Drive name: id1,sd@n5000cca8749
Drive Model: HUH721010AL4204
Gathering data for drive 4 ...
Drive name: id1,sd@n5000cca19183
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp: 41 C
Gathering data for drive 5 ...
Drive name: id1,sd@n5000cca4607
Drive Model: HUSMH8010BSS204
Gathering data for drive 6 ...
Drive name: id1,sd@n5000cca10152
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp: 41 C
我想Drive name
为缺少Drive Speed
和Drive Temp
线的任何驱动器输出 。
输出应该是:
Drive name: id1,sd@n5000cca8749
Drive name: id1,sd@n5000cca4607
这超出了我的能力范围,但我确信awk
可以做到,但我不打算使用awk
,任何完成任务的东西都可以工作(没有 GNU 工具)。谢谢!
使用
mawk
andgawk
,它支持正则表达式和多字符RS
(记录分隔符):使用
awk
which 不支持它们,可以过滤输入以将其替换为诸如换页之类的单个字符:如果记录中的行不是固定顺序,则可以通过省略 打印整个记录
{print ...}
,然后可以使用 grep 等过滤输出。这种方法的优点是可以以明显的方式修改匹配条件(例如,
/Drive Speed: 7200 RPMs/
而不是!/foo/ && !/bar/
等),它不会将整个文件加载到内存中,最重要的是,不需要你写一些钝状态机。这是一个 perl 版本:
假设输入文件末尾有一个空行。
运行:test.sh 文件
RS
如果可以依赖字段的顺序,则不需要多字符:每当您的数据中有标签/名称和值对时,最好创建/使用一个模仿代码中的数组。同样,当您有多行记录块时。在您之前的问题中,我向您展示了当您的记录以空行分隔时如何处理(请参阅https://unix.stackexchange.com/a/562552/133219),以下是当它们不是时如何处理以及如何处理使用更通用的 tag-val 方法,而不是依赖于记录中每个值的位置: