Grep um padrão de um arquivo e obter toda a palavra, não apenas o padrão

0
  1. Item da lista

I / P:

abcd_Server1 CCDDomain
defg_Server1 GGFDomain
kdkhs_Server1 CCDDomain
abce_Server1 CCDDomain
dgdg_Server1 CCADomain
dfdkhs_Server1 GGFDomain

Eu preciso procurar a palavra "Domínio" e depois contar as ocorrências únicas da palavra.

No caso acima, a saída deve ser 3, pois há 3 nomes diferentes ( CCDDomain , GGFDomain , CCADomain )

Eu tentei usar isso:

grep -oh '*Domain' "ServerNames.txt" | sort -u | wc -l 

('- oh' eu recebi de outra resposta)

    
por Aditya Telang 14.06.2018 / 13:32

4 respostas

3

Para o número de ocorrências de cada uma das diferentes palavras que contêm domínio, com GNU grep ou compatível.

  • para palavras delimitadas por caracteres espaçamento :

    <file grep -o '\S*Domain\S*' | sort | uniq -c
    
  • para palavras definidas como sequências de alnums ou sublinhados (qualquer outra coisa sendo delimitadores:

    <file grep -o '\w*Domain\w*' | sort | uniq -c
    
por 14.06.2018 / 13:52
1

Você pode simplesmente envolver seu padrão de correspondência com o padrão \w , assim:

% grep -oh "\w*Domain\w*" ServerNames.txt
CCDDomain
GGFDomain
CCDDomain
CCDDomain
CCADomain
GGFDomain

Depois, você pode prosseguir com sort -u e wc -l

% grep -oh '\w*Domain\w*' ServerNames.txt | sort -u | wc -l 
3
    
por 14.06.2018 / 13:44
0
grep -o '[[:alpha:]]*Domain[[:alpha:]]*' ServerNames.txt | sort | uniq | wc -l

ou

grep -o '\w*Domain\w*' ServerNames.txt | sort | uniq | wc -l

[[:alpha:]]* significa 0 ou mais letras. Portanto, o grep encontrará sequências de letras, incluindo 'Domínio', e as gerará para serem classificadas e unidas. ( -h não é necessário quando apenas um arquivo deve ser usado).

    
por 14.06.2018 / 13:44
0

Antiga awk abordagem:

$ awk '$2 ~ /Domain/ && !a[$2]++{ cnt++ }END{ print cnt }' ServerNames.txt
3

Com o GNU coreutils , você pode aplicar (no caso, se Domain sempre ocorrer como uma segunda coluna de cada linha):

$ uniq -f1 <(sort -k2 ServerNames.txt) | wc -l
3
    
por 14.06.2018 / 13:40