Estou com uma longa lista de endereços IP, que não estão em sequência. Preciso descobrir quantos endereços IP existem antes / depois de um endereço IP específico. Como posso conseguir isso?
shell-script
text-processing
Mandar Shinde
fonte
fonte
Respostas:
Número de linhas antes e depois de uma partida, incluindo a partida (ou seja, você precisa subtrair 1 do resultado se quiser excluir a partida):
Mas isso não tem nada a ver com endereços IP em particular.
fonte
Talvez o mais fácil seja,
Obrigado @JoshepR por apontar o erro
fonte
dc
mim, provavelmente.Fiz isso de duas maneiras, apesar de achar que gosto mais disso:
Isso salva todas elas como variáveis atuais do shell - e as avalia no loop for posteriormente para a saída. Ele conta o total de linhas no arquivo com
wc
e obtém o primeiro número de linha correspondentesed
.Sua saída:
Eu também fiz:
sed
imprime apenas números correspondentes e da última linha e, em seguida,tr
converte as\n
linhas eletrônicas intermediárias emeread
lê o primeiro dossed
resultados de$ml
e todos os outros$ll
. Possíveis casos de correspondência múltipla são tratados removendo todos os resultados, exceto o último, da$ll
expansão ao configurá-los novamente mais tarde.Sua saída:
Ambos os métodos foram testados no arquivo gerado da seguinte maneira:
Sim, pelo número da linha:
"$IP"
depois uma linha de\n
ewtr
- que traduz zeros em\n
linhas de e-mail e depois em~/file
fonte
Aqui está um pouco do código Perl que faz isso:
Isso conta o número total de linhas antes e depois da linha que contém o IP
192.168.1.1
. Substitua pelo seu IP desejado.Usando nada além do Bash:
fonte
$.
vez de um contador?$after
de$. - $before
.$. - 1
, salve$.
em$tmp
. Finalize a impressão$. - $tmp
. Portanto, não precisamos de contador para antes e depois. Claro que é menos legível que o seu.Eu estava tentando os seguintes comandos, que são um pouco complicados, mas dariam resultados precisos:
Depois de:
Antes:
fonte
Uma
awk
solução que informa o número de linhas antes e depois da última partidafonte
Grep
possui um recurso que pode contar o número de vezes que um padrão específico é encontrado. Se você usar o-c
comando que fará isso. Com o comando-c
e-v
, isso contará quantas vezes isso não corresponde a um padrão específicoExemplo:
grep -c -v <pattern> file
Então, se você tentar algo como:
grep -c -v 192.168.x.x file.log
isso deve funcionar.fonte