Anexa ao arquivo1 as diferenças da coluna específica entre dois arquivos

3

Eu gostaria de comparar os dois arquivos e apenas imprimir esta linha e anexá-la ao "source.txt":

01.02.70 08h00,4.4.4.4,443

Aqui estão meus arquivos:

source.txt

DATETIME,IPSOURCE,PORT
01.01.70 08h00,0.0.0.0,443
01.01.70 08h00,2.2.2.2,443

events.txt

DATETIME,IPSOURCE,PORT
01.02.70 09h00,0.0.0.0,443
01.02.70 09h00,2.2.2.2,443
01.02.70 08h00,4.4.4.4,443

Eu não me importo com o campo DATETIME na comparação, eu só quero adicionar o novo IP que aparece no arquivo de log "events.txt" para "source.txt" (endereços 0.0.0.0 e 2.2.2.2 aparecem nos dois arquivos).

Então, eu quero usar

grep -vxFf source.txt events.txt

sem levar em conta o primeiro campo, procuro apenas diferenças no campo IPSOURCE (segunda coluna).

    
por Alistair Wallace 11.10.2017 / 10:29

3 respostas

1

Use awk quando precisar de comparação baseada em campo

$ awk -F, 'NR==FNR{ip[$2]=$0; next} $2 in ip{delete ip[$2]} END{for(k in ip) print ip[k]}' events.txt source.txt
01.02.70 08h00,4.4.4.4,443
  • -F, set , como separador de campos de entrada
  • NR==FNR{ip[$2]=$0; next} usa o segundo campo como chave e salva toda a linha no array associativo. Este bloco de código será executado apenas para a primeira entrada de arquivo (por exemplo, events.txt)
  • $2 in ip{delete ip[$2]} quando o segundo arquivo (ou seja, source.txt) estiver processando, excluirá elementos em ip array se o segundo campo já estiver presente
  • END{for(k in ip) print ip[k]} após toda a entrada ser processada, as linhas de impressão restantes em ip array


Ou, altere a ordem dos arquivos de entrada e imprima as linhas de events.txt se o segundo campo não estiver presente no source.txt

$ awk -F, 'NR==FNR{ip[$2]; next} !($2 in ip)' source.txt events.txt
01.02.70 08h00,4.4.4.4,443
    
por 11.10.2017 / 10:38
1

Faça simplesmente:

awk -F, 'NR==FNR{arr[$2]=$0;next} !($2 in arr)' source event #>> source

Se você quiser ter uma linha de diferença anexada baseada na segunda coluna com campos separados por vírgulas, apenas Uncomment >> source no comando acima.

NÃO, se você quiser comparar com base em IP: parte de porta. então você pode usar como segue.

awk -F, 'NR==FNR{arr[$2FS$3]=$0;next} !($2FS$3 in arr)' source event #>> source
    
por 11.10.2017 / 11:14
1

De acordo com suas condições:

  • append it to "source.txt"

  • I only want to add the new IP that appears in the log file "events.txt" to "source.txt"

Aqui está uma solução completa baseada na combinação de GNU sed , corte e grep :

sed -i "\$ a $(cut -d, -f2 source.txt | grep -vf - events.txt)" source.txt

O conteúdo resultante do arquivo source.txt :

DATETIME,IPSOURCE,PORT 
01.01.70 08h00,0.0.0.0,443 
01.01.70 08h00,2.2.2.2,443
01.02.70 08h00,4.4.4.4,443
    
por 11.10.2017 / 11:19