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==1se 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 aOS_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, portantoOS_NATIVE_NAME) em outra string (aqui$0, daí a linha inteira). -
l=index(...)-sobtém o tamanho do campo e o salva para depois: o mesmo princípio de antes, mas para obter o tamanho, devemos subtrairsdele.
-
-
$1=="disk_0"encontra oDEVICEque você está pesquisando no primeiro campo (disk_0no exemplo).$1representa o primeiro campo.-
{print substr($0,s,l)}finalmente imprime para cada linha, a cadeia iniciou na posiçãos, com comprimentol.substr()é a função strings awks para cortar uma string (aqui$0; a linha inteira) da posiçãoscom comprimentol(as duas variâncias que extraímos anteriormente durante a linha de processamento 1)
-
Imprime (independentemente de onde o campo está na entrada):
sda