Tenho certeza de que há maneiras melhores de lidar com isso, mas esse par de scripts awk
fará o trabalho. Você pode usar a versão ampliada com comentários ou o one-liner abaixo; eles são funcionalmente idênticos.
awk '
BEGIN { RS="" } # Slurp paragraphs
{ print gensub("\n", " ", "g") } # Replace NL with SPACE
' /tmp/tnsnames.ora | # ...in this file
awk '
/SERVICE_NAME/ { # Only process matching lines
listener=$1; # Listener is the first field
si=NF-2; # Count fields back from end of string
service=gensub(")", "", 1, $si); # Strip trailing ")"
printf "%s\t%s\n", listener, service # Output result
}
'
Execução de amostra
awk 'BEGIN { RS="" } { print gensub("\n", " ", "g") }' /tmp/tnsnames.ora | awk '/SERVICE_NAME/ { listener=$1; si=NF-2; service=gensub(")", "", 1, $si); printf "%s\t%s\n", listener, service }'
NEWDB newdb
STEST STEST
RBSDB RBSDB