2017-09-26 9 views
0

J'ai la chaîne suivante de grep sUtilisez GNU parallel pour exécuter une série de greps?

grep -E '[0-9]{3}\.[0-9]+ ms' file.log | grep -v "Cycle Based" | grep -Ev "[0-9]{14}\.[0-9]+ ms" > pruned.log 

que je dois exécuter sur un fichier journal de 10G. Cela prend un peu plus de temps que je suis prêt à attendre, donc j'essaie d'utiliser GNU parallel, mais je ne vois pas comment je peux exécuter cette chaîne de grep en utilisant parallel.

Ce n'est pas une question de savoir comment exécuter le plus rapide possible simple grep, c'est sur la façon d'exécuter une série de grep s en parallèle

+0

double possible de [la plus rapide possible grep] (https://stackoverflow.com/questions/9066609/greget le plus rapide possible) –

+0

@MichaelFoukarakis, pas un doublon. J'ai déjà lu cette question et ce n'est pas ce que je cherche. –

+1

Vous pouvez mettre tous vos cmds 'grep' dans un script shell et l'appeler comme' myBigGrep.sh file.log' et remplacer le nom de fichier à l'avant du tube par '$ {@}' .'parallel' plusieurs fichiers à traiter. Êtes-vous prêt à passer le temps de «scinder» votre gros fichier en 'fichier001.log, fichier002.log ...'? Cela pourrait porter ses fruits, mais il faudra du temps pour le tester. Vous pouvez passer votre temps à installer log-rotate, de sorte que vous ayez des fichiers journaux quotidiens (toutes les heures?). Bonne chance. – shellter

Répondre

2

En général, le facteur limitant lorsque grepper un fichier est le disque. Si vous avez un seul disque, il y a des chances que cela vous limite.

Cependant, si vous avez RAID10/50/60 ou un système de fichiers réseau distribué, puis peut accélérer parallélisation votre traitement:

doit() { 
    grep -E '[0-9]{3}\.[0-9]+ ms' | grep -v "Cycle Based" | grep -Ev "[0-9]{14}\.[0-9]+ ms" 
} 
export -f doit 
parallel --pipepart -a file.log --block -1 -k doit > pruned.log