J'ai une longue liste d'adresses IP, qui ne sont pas en séquence. J'ai besoin de trouver combien d'adresses IP sont là avant / après une adresse IP particulière. Comment puis-je atteindre cet objectif?
shell-script
text-processing
Mandar Shinde
la source
la source
Réponses:
Nombre de lignes avant et après une correspondance, y compris la correspondance (c'est-à-dire que vous devez soustraire 1 du résultat si vous souhaitez exclure la correspondance):
Mais cela n'a rien à voir avec les adresses IP en particulier.
la source
Le plus simple est peut-être
Merci @JoshepR d'avoir signalé l'erreur
la source
dc
moi-même, probablement.J'ai fait cela de deux façons, bien que je pense que j'aime le mieux:
Cela les enregistre en tant que variables shell actuelles - et les évalue ensuite dans la boucle for pour la sortie. Il compte le nombre total de lignes dans le fichier avec
wc
et obtient le premier numéro de ligne correspondant avecsed
.Sa sortie:
J'ai aussi fait:
sed
imprime uniquement les numéros correspondants et de dernière ligne, puistr
traduit les\n
lignes électroniques intermédiaires en, etread
lit le premier dessed
résultats dans$ml
et tous les autres dans$ll
. Les cas de correspondance multiples possibles sont traités en supprimant tout sauf le dernier résultat de$ll
l'expansion de lorsque vous le redéfinissez plus tard.Sa sortie:
Les deux méthodes ont été testées sur le fichier généré de la manière suivante:
Il le fait, par numéro de ligne:
"$IP"
puis un\n
ewlinetr
- ce qui traduit les zéros en\n
ewlines puis en~/file
la source
Voici un peu de code Perl qui le fait:
Cela compte le nombre total de lignes avant et après la ligne contenant l'IP
192.168.1.1
. Remplacez par votre IP souhaitée.N'utiliser que Bash:
la source
$.
place d'un compteur?$after
à$. - $before
.$. - 1
, enregistrez$.
dans$tmp
. Fin de l'impression$. - $tmp
. Nous n'avons donc pas besoin de compteur avant et après. Bien sûr, il est moins lisible que le vôtre.J'essayais les commandes suivantes, qui sont un peu compliquées, mais donneraient des résultats précis:
Après:
Avant:
la source
Une
awk
solution rapportant le nombre de lignes avant et après la dernière correspondancela source
Grep
a une fonction qui peut compter le nombre de fois où un motif particulier est trouvé. Si vous utilisez la-c
commande qui le fera. Avec la commande-c
et-v
, cela comptera combien de fois cela ne correspond pas à un modèle particulierExemple:
grep -c -v <pattern> file
Donc, si vous essayez quelque chose comme:
grep -c -v 192.168.x.x file.log
Cela devrait fonctionner.la source