bash: grepping o conteúdo da coluna que é dinâmico

1

Eu tenho dados como segue:

O que preciso obter é o OS_NATIVE_NAME de um determinado DEVICE .

Sei que uma maneira é imprimir o valor da coluna usando:

awk '{print $*col_num*}'

Mas o número da coluna para este OS_NATIVE_NAME não é fixo. Isso porque, outros campos como STATUS podem ter valores diferentes (podem ser múltiplos em algum momento), o que está causando um problema de não ter um número de coluna fixo para OS_NATIVE_NAME , que são os dados necessários para meus testes.

Como posso usar o conteúdo dessa coluna em particular ??

    
por amitam 25.09.2015 / 08:47

3 respostas

1

com awk :

awk 'NR==1{for(i=1;i<NF;i++){if($i=="OS_NATIVE_NAME"){s=index($0,$i); l=index($0,$(i+1))-s}}}
 $1=="disk_0"{print substr($0,s,l)}' file
  • NR==1 se for a primeira linha (a linha do cabeçalho), NR é variável interna do awks para o número da linha atual que está sendo processado.
    • for(i=1;i<NF;i++) loop pelos campos. NF é variável interna do awks para o número de campos na linha atual.
    • $i=="OS_NATIVE_NAME" , pois estamos fazendo um loop em cada campo, verifique se o valor do campo é igual a OS_NATIVE_NAME
    • s=index(...) encontra a posição do início do campo e salva para mais tarde. index() é a função strings do awks para obter a posição da ocorrência de um string (aqui o valor de $ i, portanto OS_NATIVE_NAME ) em outra string (aqui $0 , daí a linha inteira).
    • l=index(...)-s obtém o tamanho do campo e o salva para depois: o mesmo princípio de antes, mas para obter o tamanho, devemos subtrair s dele.
  • $1=="disk_0" encontra o DEVICE que você está pesquisando no primeiro campo ( disk_0 no exemplo). $1 representa o primeiro campo.
    • {print substr($0,s,l)} finalmente imprime para cada linha, a cadeia iniciou na posição s , com comprimento l . substr() é a função strings awks para cortar uma string (aqui $0 ; a linha inteira) da posição s com comprimento l (as duas variâncias que extraímos anteriormente durante a linha de processamento 1)

Imprime (independentemente de onde o campo está na entrada):

sda
    
por 25.09.2015 / 09:10
0

Uma solução fácil:

data=$(vxdisk -e list)
devices=$(sed 's/ .*//' <<< "$data")
# I'm just guessing that the relevant column starts in column 80
os_native_name=$(cut -c80- <<< "$data")
row=0
for dev in $devices; do let row++; if [[ "$dev" = disk_1 ]]; then break; fi; done
# now we know our desired data is on the row'th line of os_native_name
# you can retrieve it for instance with
sed -n "$row p" <<< "$os_native_name"
    
por 25.09.2015 / 09:01
0

Experimente o comando abaixo:

vmdisk -e list | awk 'NR==1 { for(i=1;i<=NF;i++) { ix[$i] = i } } NR>1 { print $ix["OS_NATIVE_NAME"] }'
    
por 25.09.2015 / 09:22