Eu sinto que awk
é uma ferramenta mais flexível para essa tarefa. O Python também poderia ser usado, mas você teria que escrever o script em vez de copiar e colar um comando no terminal. Você terá que alterar os padrões de regex, separadores de registro e separadores de campo para que eles funcionem no seu arquivo. Se você puder fornecer um exemplo do seu arquivo (com dados sensíveis removidos ou alterados), eu editarei esta resposta.
Arquivo de teste (copiado de outro exemplo de SO e ajustado):
lease 192.23.253.2 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
lease 192.23.253.3 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
lease 192.23.253.4 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
lease 192.23.253.5 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
}
lease 192.23.253.6 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:01;
uid 00:00:00:00:00:01;
client-hostname "examle-workstation2";
}
lease 192.23.253.7 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 01:00:00:00:00:00;
}
Se você quiser o registro inteiro:
$ awk 'BEGIN{
RS="lease"
FS=" {+|;\n"
}{
n=split($1, a, ".")
last=int(a[n])
if( 3 <= last && last <= 6){
print
}
}' testfile
O que está acontecendo nesta declaração awk
:
- Defina o valor do separador de registro:
RS="lease"
. - Defina o valor do separador de campo para procurar
{
precedido por um espaço ou;\n
:FS=" {+|;\n"
. - Divida o primeiro campo em cada registro em qualquer
.
, armazene o array resultante ema
, armazene o tamanho dea
emn
. - Armazene o último elemento de
a
emlast
. - Teste se
last
é igual ou menor que nosso mínimo (2) ou selast
é igual ou maior que nosso máximo (6), se isso for verdade, imprima o registro inteiro.
Resultados:
192.23.253.3 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
192.23.253.4 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
192.23.253.5 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
}
192.23.253.6 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:01;
uid 00:00:00:00:00:01;
client-hostname "examle-workstation2";
}
Se você deseja apenas os endereços IP:
$ awk 'BEGIN{
RS="lease"
FS=" {+|;\n"
}{
n=split($1, a, ".")
last=int(a[n])
if( 3 <= last && last <= 6){
ip=gensub(/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/,"\1","", $1)
print ip
}
}' testfile
O que está acontecendo nesta declaração awk
:
- Defina o valor do separador de registro:
RS="lease"
. - Defina o valor do separador de campo para procurar
{
precedido por um espaço ou;\n
:FS=" {+|;\n"
. - Divida o primeiro campo em cada registro em qualquer
.
, armazene a matriz resultante ema
, armazene o tamanho dea
emn
. - Armazene o último elemento de
a
emlast
. - Teste se
last
é igual ou menor que nosso mínimo (2) ou selast
é igual ou maior que nosso máximo (6), se isso for verdade, use o métodogensub
para remover tudo além do endereço IP usando um padrão de expressão regular.
Resultados:
192.23.253.3
192.23.253.4
192.23.253.5
192.23.253.6