Ich versuche herauszufinden, wie ich AWK verwenden kann, um Linien zu subtrahieren. Stellen Sie sich zum Beispiel vor, die Eingabedatei lautet:
30
20
Die Ausgabe wäre:
10
Als Test versuche ich nun, die "Used" -Speicherspalte zu berechnen aus:
$ cat /proc/meminfo
Im Moment habe ich folgendes geschrieben:
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
-- Here comes the calculation using AWK
Ich habe folgendes versucht:
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}'
Dies gibt mir jedoch nur die letzte Datenzeile.
Ich habe eine funktionierende Lösung gefunden, aber ich bezweifle, dass es die optimalste ist. Alle meine Codierungserfahrungen zeigen mir, dass die harte Codierung der Anzahl der Zeilen schrecklich ist: P.
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}' | awk 'NR == 1{s=$0} NR == 2 {s=s-$0} END {print s}'
line1_$2 - line2_$2 - lineN-$2
? Möchten Sie nur die ersten beiden aufeinander folgenden Zeilen subtrahieren?Antworten:
Sie können dies auch tun mit
awk
,paste
undbc
. Ich finde diesen Ansatz leichter zu merken. Die Syntax vonawk
erfordert immer, dass ich nachschaue, um ihn zu bestätigen.HINWEIS: Dieser Ansatz hat den Vorteil, dass er mit mehreren Ausgabezeilen konkurrieren kann und die 2., 3., 4. usw. Zahlen von der 1. subtrahiert.
Einzelheiten
Mit dem obigen
awk
Befehl wird die Spalte ausgewählt, die die Zahlen enthält, die subtrahiert werden sollen.Wir verwenden dann
paste
, um diese 2 Wertewerte zu kombinieren und das Minuszeichen dazwischen hinzuzufügen.Wenn wir dies übergeben,
bc
führt es die Berechnung durch.quelle
Die rein awk-Lösung, keine redundanten Cat- oder Grep-Befehle:
awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo
Ich sehe, dass awk_FTW mich geschlagen hat, aber ich dachte, das Formatieren der Ausgabe könnte nett sein.
quelle
Versuche dies:
quelle