
Eu tenho um arquivo onde há nomes na posição do primeiro caractere. Estou tentando encontrar uma maneira de agrupar todos os nomes. Exemplo aqui eu gostaria que os nomes BUBBA e SUSAN fossem listados.
BUBBA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = bubba01)(PORT = xxxx))
)
(CONNECT_DATA =
(SERVICE_NAME = bubba01)
)
)
SUSAN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = susan01)(PORT = xxxx))
)
(CONNECT_DATA =
(SID = susandb)
)
)
Responder1
Parece que você só quer:
grep -o '^[A-Z]\+'
-o
significa apenas gerar a parte correspondente da linha, e o regex corresponde a uma sequência de uma ou mais letras maiúsculas no início de uma linha.
Você também pode fazer esse tipo de coisa com sed
, que é muito complicado para este exemplo, mas útil (e mais simples que awk
ou perl
) se você precisar fazer correspondências ou transformações mais complexas:
sed -n '/^[A-Z]\+/{s/^\([A-Z]\+\).*/\1/;p}'
Responder2
Usando awk
:
awk 'NF > 1 && $1 !~ /^\(|\)/ {print $1}' file
Imprima apenas linhas com pelo menos um campo ( NF > 1
) e ignore as linhas que começam com (
ou )
: ^\(|\)
.
Responder3
Se todos os arquivos de entrada estiverem formatados da mesma forma, para uma solução simples do awk:
awk '/^[a-Z]/ {print $1}' filename
Usar o carrat ( ^
) selecionará apenas as entradas que possuem um caractere no início de cada linha. Em seguida, imprima apenas o primeiro campo ignorando o =
.