Anexa dados de múltiplos arquivos ao novo arquivo separados por uma linha

2

Tenho mais de cem regras de firewall para muitos clientes diferentes em arquivos discretos em uma pasta.

Suponha que os nomes dos arquivos sejam:

1.wawa.com_firewall_rule

2.newa.com_firewall_rule

Cada arquivo contém os IPs dos clientes. O que preciso é extrair os IPs de cada cliente do arquivo e anexá-lo a um novo arquivo SINGLE no seguinte formato:

wawa.com
192.168.1.1
newa.com
8.8.8.8
9.9.9.9

Neste momento, consegui extrair os IPs e salvá-los em novos arquivos. Mas eu preciso salvar tudo em um único arquivo. (como um relatório) - veja meu código abaixo

#!/bin/bash
cd /opt/zeus/zxtm/conf/rules/sba_filter/test
for f in *; do 
#echo $f > hosts.txt
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" "$f" > "$f.txt"
done
    
por scandalous 07.06.2016 / 14:55

3 respostas

3

Preservando seu trabalho, uma possível solução poderia ser:

#!/bin/bash
cd /home/prova
for f in *; do 
  basename $f '_firewall_rule' >> output.txt
  printf "\n" >> output.txt
  grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" "$f" | while read -r line ; do
    echo $line >> output.txt
    printf "\n" >> output.txt
  done
done

Veja as contribuições de otimização nos comentários

    
por 07.06.2016 / 15:12
2
find your_dir -name "*firewall_rule"
-exec basename {} \;
-exec echo \;
-exec grep -P '(\d{1,3}\.){3}\d{1,3}' {} \;
-exec echo \;
> your_output_file

Isto irá (linha por linha):

  • Localize todos os arquivos em your_dir terminando em "firewall_rule"
  • Saída de uma linha em branco
  • Output all [0-999]. [0-999]. [0-999]. [0-999] Endereços IP
  • Saída de outra linha em branco
  • Envie a saída para um novo arquivo chamado your_output_file
por 07.06.2016 / 15:05
2

Você pode fazer tudo com o awk em um único comando se não tiver muitos arquivos para a linha de comando:

awk --posix 'FNR==1 {f=FILENAME; sub("_firewall_rule", "", f); print f "\n"} /([0-9]{1,3}\.){3}[0-9]{1,3}/ {print $0 "\n"}' *_firewall_rule

para minha versão de gawk , eu precisava do --posix para que as chaves funcionassem corretamente na regex.

Como funciona

Sempre que um novo arquivo for iniciado, FNR será 1, já que é o primeiro registro no arquivo, portanto, obteremos o nome do arquivo da variável FILENAME incorporada, removeremos a parte _firewall_rule e imprimiremos o que deixado com uma linha em branco

Em seguida, qualquer linha que se pareça com um endereço IPv4, imprimiremos essa linha com uma nova linha extra.

Se você não quisesse as linhas em branco extras entre todos os IPs e os nomes, você pode remover as \n partes da impressão e, na verdade, simplificar a parte do padrão da seguinte forma:

awk --posix 'FNR==1 {f=FILENAME; sub("_firewall_rule", "", f); print f} /([0-9]{1,3}\.){3}[0-9]{1,3}/ ' *_firewall_rule
    
por 07.06.2016 / 16:16