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 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(...)-s
obtém o tamanho do campo e o salva para depois: o mesmo princípio de antes, mas para obter o tamanho, devemos subtrairs
dele.
-
-
$1=="disk_0"
encontra oDEVICE
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çãos
, com comprimentol
.substr()
é a função strings awks para cortar uma string (aqui$0
; a linha inteira) da posiçãos
com 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