2014-03-12 24 views
8

Ich brauche Schleife n Zeilen einer Datei und für jede i between 1 and n - 1, um den Unterschied line(n - 1) - line(n) zu bekommen.Linux Unterschiede zwischen aufeinanderfolgenden Zeilen

Und hier ist die Quelldatei:

[email protected]:/var/www# cat cron.log | grep "/dev/vda" 
/dev/vda   20418M 14799M  4595M 77%/
/dev/vda   20418M 14822M  4572M 77%/
/dev/vda   20418M 14846M  4548M 77%/
/dev/vda   20418M 14867M  4527M 77%/
/dev/vda   20418M 14888M  4506M 77%/
/dev/vda   20418M 14910M  4484M 77%/
/dev/vda   20418M 14935M  4459M 78%/
/dev/vda   20418M 14953M  4441M 78%/
/dev/vda   20418M 14974M  4420M 78%/
/dev/vda   20418M 15017M  4377M 78%/
/dev/vda   20418M 15038M  4356M 78%/
[email protected]:/var/www# cat cron.log | grep "/dev/vda" | cut -b 36-42 | tr -d " M" 
4595 
4572 
4548 
4527 
4506 
4484 
4459 
4441 
4420 
4377 
4356 

diejenigen /dev/vda... Linien stündlich mit df -BM in cron.log Datei und die Differenz zwischen den Zeilen protokolliert werden, wird die stündliche Plattenverbrauch offenbaren.

So ist die erwartete Ausgabe wird:

23 (4595 - 4572) 
24 (4572 - 4548) 
... 
43 (4420 - 4377) 
21 (4377 - 4356) 

Ich brauche nicht den Text zwischen ( und ), habe ich es hier für die Erklärung nur.

Antwort

11

Ich bin mir nicht sicher, ob ich Sie richtig aufgestellt, aber der folgende awk Skript funktionieren soll:

awk '{if(NR>1){print _n-$4};_n=$4}' your.file 

Ausgang:

23 
24 
21 
21 
22 
25 
18 
21 
43 
21 

Sie nicht die anderen Programme brauchen in das Rohr. Nur:

awk '/\/dev\/vda/ {if(c++>0){print _n-$4};_n=$4}' src/checkout-plugin/a.txt 

wird genug sein. Der Regex beim Start der awk Skripte sagt awk an, den folgenden Block nur auf Zeilen anzuwenden, die dem Muster entsprechen. Ein Nebeneffekt ist, dass NR nicht mehr verwendet werden kann, um die "zweite Zeile" zu erkennen, in der die Berechnung beginnt. Ich habe zu diesem Zweck einen Kundenzähler c eingeführt.

Beachten Sie auch, dass awk die M für sich entfernt, da die Spalte in einer numerischen Berechnung verwendet wurde.

+2

Schöne Antwort. Du könntest dir vielleicht vorstellen, OP zu zeigen, wie man Muster hinzufügt, um Zeilen beginnend mit '/ dev/vda' zu wählen, damit er einfach 'awk'/^ \/dev \/vda/.... 'OriginalLogFile ausführen kann, dh ohne dass er es braucht Grep zuerst. –

+0

@MarkSetchell Sicher, die anderen Programme in der Pipe werden nicht benötigt. Überprüfen Sie mein Update. – hek2mgl

+0

Du bekommst meine Stimme :-) –

Verwandte Themen