Como contar o número de instâncias de uma palavra que começa em outra palavra

0

Eu preciso de grep do log de erro do MySQL começando na data de hoje formatada como:

'date +"%y%m%d"' (140710) 

E procure todas as instâncias da palavra partitioned .

Eu tentei várias coisas sem sucesso. Isso pareceu funcionar:

more +/"'date +"%y%m%d"'" mysql-error.log | grep -c partitioned

No entanto, se o arquivo de log não contiver nenhuma entrada de hoje, em vez de retornar zero, ele pesquisará o arquivo inteiro e retornará um número para o arquivo inteiro.

Eu preciso que ele retorne zero, se não houver entradas a partir de hoje, não grep do arquivo inteiro e conte os resultados.

Existe alguma maneira melhor de fazer isso usando sed ou awk ou algo assim?

Tecnicamente, o que eu suponho que preciso contar é } partitioned { seguido por uma string de caracteres numéricos alfa,}) porque {{sem qualquer string}} em partes poderia ocorrer e não deveria ser contado.

Isso não é um requisito estrito. Eu ficaria feliz em apenas contar instâncias da palavra partitioned .

Aqui está um exemplo do arquivo de log:

140109 12:25:07 [Note] WSREP: view(view_id(PRIM,c4819ddf-7952-11e3-89fc-4f9f1bfa267f,3) memb {
    c4819ddf-7952-11e3-89fc-4f9f1bfa267f,
} joined {
} left {
} partitioned {
    f85c2e70-7952-11e3-a759-aa8332246e85,
})
140109 12:25:07 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 85)
    
por Brad 10.07.2014 / 13:41

2 respostas

1

Com GNU sed anhd grep , você pode tentar:

sed -n "/$(date +%y%m%d)/,\$p" file | grep -c partitioned

/pattern/,$ corresponde ao primeiro padrão ao final do arquivo.

Com sua entrada:

$ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned
1

Sem data de correspondência:

$ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned
0
    
por 10.07.2014 / 15:28
1

Você pode tentar encadear dois greps juntos:

grep 'date +"%y%m%d"' mysql-error.log | grep -c partitioned

Ou ainda mais simples:

grep -c "'date +%y%m%d'.*partitioned" mysql-error.log

EDITAR

Como a data e a palavra "particionado" estão em linhas diferentes, então:

d=$(date +"%y%m%d"); awk '/'$d'/,EOF {print $0}' mysql-error.log | grep -c partitioned

Ou:

awk '/'$(date +%y%m%d)'/,EOF {print $0}' mysql-error.log | grep -c partitioned
    
por 10.07.2014 / 13:56