2016-10-18 10 views
1

Ich habe Löschen datei.txt enthält:mehrere Zeilen oberhalb und unterhalb von einem Anpassungsmuster in einer Datei mit awk/sed/grep

registered 
{ 
    hostname-1 
    { 
     AAA 32; 
     BBB uuid-1; 
     ip 192.168.1.1; 
     host hostname-1; 
     ... 
     ... 
     ... 
    } 
} 
registered 
{ 
    hostname-2 
    { 
     AAA 31; 
     BBB uuid-2; 
     ip 192.168.1.2; 
     host hostname-2; 
     ... 
     ... 
     ... 
    } 
} 
registered 
{ 
    hostname-3 
    { 
     AAA 33; 
     BBB uuid-3; 
     ip 192.168.1.3; 
     host hostname-3; 
     ... 
     ... 
     ... 
    } 
} 

Ich möchte auf passende ip einen vollständigen registrierten Block basiert löschen.

z. wenn IP 192.168.1.2, dann sollte der Ausgang sein:

registered 
{ 
    hostname-1 
    { 
     AAA 32; 
     BBB uuid-1; 
     ip 192.168.1.1; 
     host hostname-1; 
     ... 
     ... 
     ... 
    } 
} 
registered 
{ 
    hostname-3 
    { 
     AAA 33; 
     BBB uuid-3; 
     ip 192.168.1.3; 
     host hostname-3; 
     ... 
     ... 
     ... 
    } 
} 

I 2 Wege versucht, dies zu erreichen, aber konnte es nicht

1) Mit grep funktioniert: Das hat nicht funktioniert.

grep -v -B6 -A6 $IP file.txt > out.txt 
mv -f out.txt file.txt 

2) Mit awk: Wenn ich die genaue IP im awk Befehl geben unten dann funktioniert es

awk '/192.168.1.2/{for(x=NR-6;x<=NR+6;x++)d[x];}{a[NR]=$0}END{for(i=1;i<=NR;i++)if(!(i in d))print a[i]}' file.txt 

Aber ich will die Variable $ IP im awk Befehl zu übergeben. Es funktioniert nicht

awk -v pattern="${IP}" '$0 ~ pattern/{for(x=NR-6;x<=NR+6;x++)d[x];}{a[NR]=$0}END{for(i=1;i<=NR;i++)if(!(i in d))print a[i]}' file.txt 

Jede Hilfe, um das Problem hier herauszufinden, würde sehr geschätzt werden.

Danke.

+0

das awk eins mit Variable hat einen Tippfehler ... das '/' sollte nicht da sein – Sundeep

+1

Vielen Dank für den Hinweis auf das Problem. Ja, nach dem Entfernen der '/' hat es funktioniert. – user4060247

Antwort

0
IP=192.168.1.2 
awk '/'$IP'/{for(x=NR-6;x<=NR+6;x++)d[x];}{a[NR]=$0}END{for(i=1;i<=NR;i++)if(!(i in d))print a[i]}' file.txt 
+0

Vielen Dank. Es funktionierte. – user4060247

1

Dies könnte für Sie arbeiten (GNU sed):

sed -n '/^registered/h;//!H;/^}/!b;g;/192\.168\.1\.2/!p' file 

die Datei Providing ist wie es ist. Dadurch werden ganze registrierte Blöcke gesammelt und die eine (n) gelöscht, die die Zeichenfolge 192.168.1.2 enthalten.

+0

Danke. Das funktioniert, aber meine Anforderung war, IP als Variable zu verwenden. – user4060247

+0

Kannst du bitte vorschlagen, wie man das generische für irgendeine IP macht? – user4060247

Verwandte Themen