2010-07-20 3 views
7

ho una serie di file di indice per alcuni file di dati che fondamentalmente prendono il formato del file indicebash trovare incatenato ad un grep che quindi stampa

: asdfg.log.1234.2345.index file di dati

: asdfg .log

L'idea è di effettuare una ricerca di tutti i file indice. Se il valore XXXX viene visualizzato in un file di indice, andare e grep il relativo file di dati corrispondente e stampare la riga nel file di dati in cui appare il valore XXXX.

Finora posso semplicemente cercare i file di indice per il valore XXXX, ad es.

find . -name "*.index" | xargs grep "XXXX"  // Gives me a list of the index files with XXXX in them 

Come si fa a trovare il file di indice corrispondente e quindi grep il suo file di dati corrispondente?

risposta

3

Questo fa il trucco?

find . -name '*.index' | 
xargs grep -l "XXXX" | 
sed 's/\.log\.*/.log/' | 
xargs grep "XXXX" 

Il comando find è dal tuo esempio. Il primo xargs grep elenca solo i nomi dei file (indice). Lo sed associa i nomi dei file ai nomi dei file di dati. Il secondo xargs grep esegue la scansione dei file di dati.

È possibile inserire un passaggio sort -u dopo il passaggio sed.

+0

grazie Jonathan - questo è più o meno quello che sto dopo il inital sed non completamente, quindi l'ho sostituito con. Grazie a sed 's/\. Log. * /. Log /' – wmitchell

+0

Questo fallirà se i tuoi file sono chiamati nomi con spazio, 'o ". Per capire perché http://en.wikipedia.org/wiki/ xargs # The_separator_problem con GNU parallelo http://www.gnu.org/software/parallel/ il problema di separazione è limitato a nomi di file che contengono \ n find -name '* .index' |.. parallelo grep -l "XXXX" | sed 's/\. Log \. * /. Log /' | sort -u | grep parallelo "XXXX" Guarda il video introduttivo su GNU Parallel all'indirizzo http://www.youtube. com/watch? v = OpaiGYxkSuQ –

+0

@Ole: concordato che questo esegue falli di spazi, newline e così via nei nomi dei file - tuttavia, la domanda è posta in un contesto che presuppone l'assenza di tali complicazioni (usa plain find, non 'find ... -print0', e usa plain' xargs' not 'xargs -0'), quindi la risposta data funziona nello stesso ambiente. –

0
grep -l "XXXX" *.index | while read -r FOUND 
do 
    if [ -f "${FOUND%.log*}log" ];then 
     grep "XXXX" "$FOUND" 
    fi 
done