Como analisar tabela para padrão se padrão inclui espaços

2

Uma continuação desta pergunta: analisa a primeira coluna da saída do comando, obtém o segundo valor de coluna correspondente Digamos que eu tenha um comando que produza uma string formatada como uma tabela, como mostrado abaixo. E se o "padrão" que estou procurando incluir espaços? Por exemplo, se a tabela for:

First Characteristic:     b
Second Characteristic:    89.4
Version:                  58.93
Name of Device:           myDevice
Name of Device Load:      myDevice-load-123abc

E se eu quiser obter o valor ao lado de "Nome da carga do dispositivo" na tabela acima?

Para esclarecer, sei que o valor que estou procurando está ao lado de "Nome da carga do dispositivo". Não sei se está na quinta linha da saída, e não sei nada sobre como seria esse valor (por isso não posso tentar correspondência de padrões com algo como "-load-", por exemplo).

    
por farid99 08.07.2015 / 21:38

5 respostas

1

E sobre isso:

grep "Name of Device Load:" your_file.txt| cut -d ":" -f 2 | tr -d " "

Isso só mantém a linha em que você está interessado, separa-a em dois campos (funciona somente se : estiver presente apenas uma vez por linha) e, em seguida, removerá espaços.

    
por 09.07.2015 / 00:22
2

Eu usaria perl para isso.

Algo parecido com isto:

#!/usr/bin/env perl

use strict;
use warnings;

local $/;
my %lookup = ( <> =~ m/^(.*): (\S+)$/gm );
print $lookup{'Name of Device Load'},"\n";

Lemos os dados de STDIN ou nomes de arquivos: myscript.pl filename (Isso é o que o <> faz, é um pouco mágico).

Analisamos isso usando grupos de captura de expressões regulares, e como capturamos dois elementos no tempo (e repetidamente em várias linhas graças aos gm flags), criamos uma tabela de hash de pares de valores-chave.

Em seguida, extraia o valor associado à chave nomeada Name of Device Load e imprima-o, para que a ordenação seja irrelevante.

    
por 08.07.2015 / 22:54
1

Você precisa definir como os campos são delimitados de uma forma ou de outra. No seu caso, parece que cada linha consiste em uma tag que termina com dois pontos e, em seguida, alguns espaços em branco e, em seguida, um valor. Com o awk, você pode definir o delimitador de registro como : ou (com a maioria das versões do awk) como : e após o espaço em branco.

awk -v RS=':[ \t]*' '$1 == "Name of Device Load" {print $2}'

Observe que $2 corresponde apenas até o segundo cólon na linha. Se você quiser imprimir o resto da linha, pode retirar a tag:

awk -v RS=':[ \t]*' '$1 == "Name of Device Load" {sub(/^[^:]*:[ \t]*/); print $0}'

Se tudo o que você deseja fazer é extrair dados das linhas que correspondem a um padrão específico, o uso de sed faz o trabalho mais diretamente. Passe a opção -n para desativar a impressão automática e imprima apenas as linhas para as quais a retirada da etiqueta desejada é bem-sucedida.

sed -n 's/^Name of Device Load: *//p'
    
por 09.07.2015 / 02:44
1

Eu usaria o awk -F ":" para ele. Então, se você quisesse a segunda coluna, você poderia fazer

awk -F":" 'FNR == 5 {print $2}'

Esta é uma solução improvisada, mas funcionaria neste caso.

Se o padrão que você conhece e deseja for "Nome da carga do dispositivo", você pode fazer

cat file.txt | grep "Name of Device Load" | awk -F":" '{print $2}'

EDITAR: Adicionado a opção para a quinta linha e segunda linha e procure por padrão. Basicamente seguiu este tópico

link

    
por 08.07.2015 / 22:09
-2

através do script abaixo podemos obter um segundo valor

awk -F: / Nome da carga do dispositivo: / {print $ 2} file1

    
por 14.12.2017 / 14:29