Isso está relacionado a awk print 2 lines back se corresponder, mas como meu comando tem problemas de buffer que não consigo resolver, acho que uma abordagem melhor seria ignorar completamente o stderr e procurar a saída com falta de certas linhas.
Então minha saída será:
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
E eu gostaria de produzir o Drive name
para qualquer unidade que falte as linhas Drive Speed
e .Drive Temp
A saída deve ser:
Drive name: id1,sd@n5000cca8749
Drive name: id1,sd@n5000cca4607
Isso está além das minhas capacidades, mas tenho certeza de que awk
posso fazer isso, mas não estou definido para usar awk
, qualquer coisa que realize a tarefa funcionará (não possui ferramentas GNU). Obrigado!
Com
mawk
egawk
, que suportam regex e vários caracteresRS
(separadores de registro):Com um
awk
que não os suporta, a entrada pode ser filtrada para substituí-la por algum caractere único como feed de formulário:Se as linhas dentro de um registro não estiverem em uma ordem fixa, registros inteiros podem ser impressos omitindo o
{print ...}
, e então a saída pode ser filtrada com grep, etc.Essa abordagem tem a vantagem de que a condição de correspondência pode ser modificada de maneira óbvia (por exemplo ,
/Drive Speed: 7200 RPMs/
em vez de!/foo/ && !/bar/
, etc), que não carrega o arquivo inteiro na memória e, o mais importante, não exige que você escreva alguns máquina de estado obtusa.Esta é uma versão perl:
Supondo que haja uma linha vazia no final do arquivo de entrada.
Execute com: arquivo test.sh
Não há necessidade de vários caracteres
RS
se a ordem dos campos puder ser confiável:Sempre que você tiver pares de tag/nome e valor em seus dados, é melhor criar/usar uma matriz que imite isso em seu código. Da mesma forma quando você tem blocos de registros de várias linhas. Na sua pergunta anterior, mostrei como lidar com isso quando seus registros são separados por linha em branco (consulte https://unix.stackexchange.com/a/562552/133219 ), veja como fazer isso quando não são e como para usar a abordagem tag-val mais geral em vez de depender da posição de cada valor no registro: