grep várias strings, count lines, echo output para cada string

3

Eu tenho um diretório de arquivos que é estruturado assim:

data/directory1/file1.xml
data/directory2/file2.xml
data/directory3/file3.xml
...

Existem milhares de subdiretórios em data /, cada um com um arquivo xml.

Eu gostaria de escanear recursivamente dados / e procurar por três padrões, em seguida, ecoar a contagem da correspondência de padrões (idealmente) com um rótulo antes de cada. Então, para minha saída, gostaria de ver

Pattern 1 = 20
Pattern 2 = 100
Pattern 3 = 432

Eu consegui usar isso para executar um de cada vez usando:

grep -E -r 'Pattern 1' data/ | wc -l
grep -E -r 'Pattern 2' data/ | wc -l
grep -E -r 'Pattern 3' data/ | wc -l 

Agora estou tentando colocar tudo isso em um shell script com um argumento, que seria o diretório pai de data /. Em seguida, imprima a contagem para cada padrão para a saída padrão ou count.txt.

Sua ajuda é apreciada!

    
por karavan 15.01.2013 / 16:52

2 respostas

4

Você deve verificar grep -c , ele faz exatamente o que você descreve. Se você precisar de mais flexibilidade, provavelmente poderá usar awk . Tente algo assim (digitado diretamente no navegador e não testado):

dir=$1
# add tests to check if $1 exists (-d) and/or is non null (-n)

find "${dir}" | awk <<\EOF

BEGIN {
   pat1 = 0;
   pat2 = 0;
   ...
}

/pattern/ { pat1 += 1;}
/otherpattern/ {pat2 += 2;}
...

END {
   print "pattern", pat1;
   print "otherpattern", pat2;
   ...
}
EOF

Deixo a você a responsabilidade de elaborar os detalhes do comando find ou do script awk .

    
por 15.01.2013 / 17:08
2

O script a seguir faz um loop sobre o padrão e imprime a contagem total de correspondências para cada padrão. Ele pesquisa no diretório cujo nome é passado como um argumento ou no diretório atual, se você não passar um argumento.

#!/bin/sh
for p in 'Pattern 1' 'Pattern 2' 'Pattern 3; do
  printf '%s = ' "$p"; grep -E -r -e "$p" "${1:-.}/data" | wc -l
done
    
por 16.01.2013 / 01:24

Tags