J’ai ci-dessous fichier dire “Main.cap” dans unix–
Si je veux capturer tous les paquets d’une adresse IP particulière, indiquez: 1.1.1.1 à condition que tous les paquets ne soient pas de la même taille
Device:A Host:B IP:0.0.0.0 Time:123654 Location:India Device:B Host:C IP:1.1.1.1 Time:125423 Device:C Host:D IP:1.1.1.1 Time:129423 Device:E Host:F IP:1.1.1.1 Time:125423 Location:Germany Device:G Host:H IP:1.2.5.6 Time:12543
La sortie requirejse du fichier ci-dessus est comme ci-dessous-
Device:B Host:C IP:1.1.1.1 Time:125423 Device:C Host:D IP:1.1.1.1 Time:129423 Device:E Host:F IP:1.1.1.1 Time:125423 Location:Germany
J’essaie l’option Awk RS.
Utiliser gawk
:
gawk 'BEGIN{ORS="\n\n";RS=""}/.*^IP:1\.1\.1\.1$.*/' file
Ou n’importe quoi:
awk -v ip=1.1.1.1 'BEGIN { ORS="\n\n"; RS = ""; FS = "\n" } { for (i = 1; i <= NF; ++i) if ($i == "IP:" ip) { print; next } }' file
Sortie:
Device:B Host:C IP:1.1.1.1 Time:125423 Device:C Host:D IP:1.1.1.1 Time:129423 Device:E Host:F IP:1.1.1.1 Time:125423 Location:Germany
La réponse de @konsolebox contient une solution GNU awk
( gawk
) élégante . il suffit d’un simple ajustement pour en faire une solution compatible POSIX :
awk -v RS='' -v ORS='\n\n' '/\nIP:1\.1\.1\.1\n/' file
Avec l’adresse IP transmise en tant que variable:
awk -v RS='' -v ORS='\n\n' -v ip='1.1.1.1' '$0 ~ "\nIP:"ip"\n"' file
Notez que définir RS
(le séparateur d’enregistrements d’entrée) sur une chaîne vide est un idiome awk
qui divise l’entrée en enregistrements par des lignes vides, de sorte que chaque enregistrement contienne une série de lignes consécutives non vides .