xargs grep sugestão

2
grep -v "\<Swap" instruments.log | awk '{ idx=index($0, "MasterId="); masterId=substr($0, idx+length("MasterId=")+1); masterId=substr(masterId,1,index(masterId,"L")-3); print masterId; }' | xargs grep rel.log

Eu preciso pesquisar cada uma dessas MasterId / saída de awk em rel.log usando xargs ou algo assim.
Como eu posso fazer isso?

    
por Anthon 01.02.2012 / 00:21

2 respostas

2

Use while com read para obter uma linha de cada vez do canal e alimente-a com grep .

grep -v "\<Swap" instruments.log | \
  awk '{ idx=index($0, "MasterId=");
    masterId=substr($0, idx+length("MasterId=")+1);
    masterId=substr(masterId,1,index(masterId,"L")-3);
    print masterId; }' |\
  while read line; do
    grep -- "$line" rel.log
  done
    
por 01.02.2012 / 00:34
3

Você pode passar um padrão de múltiplas linhas para grep, para pesquisar uma linha que contenha uma correspondência para qualquer um dos padrões. Em outras palavras, um padrão multilinha é uma disjunção dos padrões em cada linha.

print_one_pattern_per_line | grep -f - rel.log

Por acaso, você pode simplificar a parte print_one_pattern_per_line. Já que você está chamando o awk, você pode fazer a linha de entrada correspondente dentro dela. E o seu código awk pode ser escrito de forma mais simples, usando a substituição de expressão regular para remover tudo até MasterId= (assumindo que há uma única ocorrência de MasterId= em cada linha, porque seu código corresponde à primeira instância enquanto meu regexp abaixo corresponde à última instância).

<instruments.log awk '
    !/(^|[[:space:]])Swap/ {
        gsub(/.*MasterId=/, "");
        $0 = substr($0, 1, index($0, "L")-3);
        print;
    }' | grep -f - rel.log
    
por 01.02.2012 / 01:08

Tags