AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 562661
Accepted
jesse_b
jesse_b
Asked: 2020-01-18 09:32:40 +0800 CST2020-01-18 09:32:40 +0800 CST 2020-01-18 09:32:40 +0800 CST

Imprima a linha se a seguinte linha estiver faltando

  • 772

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 namepara qualquer unidade que falte as linhas Drive Speede .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 awkposso fazer isso, mas não estou definido para usar awk, qualquer coisa que realize a tarefa funcionará (não possui ferramentas GNU). Obrigado!

awk text-processing
  • 4 4 respostas
  • 133 Views

4 respostas

  • Voted
  1. Best Answer
    mosvy
    2020-01-18T10:12:21+08:002020-01-18T10:12:21+08:00

    Com mawke gawk, que suportam regex e vários caracteres RS(separadores de registro):

    awk -v RS='Gathering data' -F'\n' '/Drive name/ && !/Drive Speed/ && !/Drive Temp/{print$(NF-2)}' file
    

    Com um awkque não os suporta, a entrada pode ser filtrada para substituí-la por algum caractere único como feed de formulário:

    awk '/Gathering data/{$0="\f"} 1' file | awk -v RS='\f' -F'\n' '/Drive name/ && !/Drive Speed/ && !/Drive Temp/{print$(NF-2)}'
    

    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.

    • 2
  2. Philippe
    2020-01-18T10:37:09+08:002020-01-18T10:37:09+08:00

    Esta é uma versão perl:

    #!/usr/bin/env bash
    
    perl -ne '
        $l = $_ if (/Drive name:/);
        $s = 1  if (/Drive Speed:/);
        if (/^\s*$/) {
            print "$l\n" if (! defined($s));
            $s = undef;
        }
    ' "$1"
    

    Supondo que haja uma linha vazia no final do arquivo de entrada.

    Execute com: arquivo test.sh

    • 2
  3. RudiC
    2020-01-18T13:38:16+08:002020-01-18T13:38:16+08:00

    Não há necessidade de vários caracteres RSse a ordem dos campos puder ser confiável:

    awk '/Drive name/ {if (!LCNT && OLDNM) print OLDNM; OLDNM = $3; LCNT = 0} /Drive (Speed|Temp)/ {LCNT++}' file3
    id1,sd@n5000cca8749
    id1,sd@n5000cca4607
    
    • 1
  4. Ed Morton
    2020-01-20T09:27:46+08:002020-01-20T09:27:46+08:00

    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:

    $ cat tst.awk
    BEGIN { FS=": *" }
    /^Gathering data/ { prt() }
    { tags2vals[$1] = $0 }
    END { prt() }
    
    function prt() {
        if ( ("Drive name" in tags2vals) && ( !("Drive Speed" in tags2vals) || !("Drive Temp" in tags2vals) ) ) {
            print tags2vals["Drive name"]
        }
        delete tags2vals
    }
    
    $ awk -f tst.awk file
    Drive name:  id1,sd@n5000cca8749
    Drive name:  id1,sd@n5000cca4607
    
    • 0

relate perguntas

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve