Ler de várias fontes de entrada e aplicar ações personalizadas exige a necessidade de awk
. Você poderia simplesmente fazer isso como
awk 'FNR==NR{pidMap[$2]=$1; next}$3 in pidMap{$3=pidMap[$3]}1' <(echo "$PKG_PID_LIST") <(logcat)
O <()
é uma sintaxe fornecida pelo shell bash
que executa o comando dentro e faz a saída do comando como se estivesse aparecendo em um arquivo. Como o conteúdo do segundo arquivo, fazemos a saída de logcat
aparecer lá. Então, awk
tenta ler dois fluxos de entrada.
A lógica FNR==NR
in awk
usada quando lemos de mais de um fluxo de entrada de cada vez. FNR
e NR
são variáveis especiais que controlam os números de linha por arquivo e ao longo de todo o fluxo de entrada. Então, com a condição FNR==NR
, basicamente definimos a ação após ela em {..}
para ser executada no primeiro arquivo e a seguinte no segundo.
Assim, no primeiro fluxo arquivo , vemos a saída de PKG_PID_LIST
a partir da qual criamos um hash-map com chave como o id do processo e o nome do processo como o valor . Quando terminarmos de processar esse arquivo, teríamos mapeado todos os PIDs com seus nomes.
No segundo arquivo, usamos esse mapa $3 in pidMap
, o valor de $3
no segundo fluxo está presente como a chave que acabamos de processar, atualizamos o $3
no segundo fluxo ( $3
- coluna delimitada por terceiro espaço) como o valor mapeado para a chave. O {..}1
é uma ação em awk
onde instruímos a reconstrução da linha com base nas modificações feitas (se nenhuma modificação for feita, imprimir linha como tal).
Se o logcat
estiver produzindo saída continuamente e você quiser executar este comando depois que a saída for resolvida, sugiro gravar a saída em um arquivo temporário primeiro e depois passar esse arquivo como o arquivo 2º argumento em awk
.