Extraire des paquets avec un délimiteur de nouvelle ligne

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 .