sveni-lee
Anmeldungsdatum: 28. Mai 2013
Beiträge: 258
|
ich würde gern per script einiges aus "/proc/meminfo" auslesen und weiter verwenden...
allerdings habe ich nicht verstanden wie man regexp in einem bash-script einseten kann... ich würde gern filgenden regexp ausfiltern: kann mir jemand auf die sprünge helfen...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Die Shell selbst kann keine PCRE-Ausdrücke, aber mit grep kann man die nutzen, wenn man den Perl-Modus anschaltet:
grep -P 'MemTotal:\s+(\d+)' /proc/meminfo
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Man könnte natürlich auch die Regulären Ausdrücke nutzen, die POSIX vorsieht:
grep "MemTotal:[[:space:]]\+[[:digit:]]\+" /proc/meminfo
|
sveni-lee
(Themenstarter)
Anmeldungsdatum: 28. Mai 2013
Beiträge: 258
|
das klappt super... Danke Gibt es auch eine Möglichkeit nur den Wert anzeigen zu lassen? | svenilee@Gotham-City:~$ grep -P 'MemTotal:\s+(\d+)' /proc/meminfo
MemTotal: 7867448 kB
|
|
Hefeweiz3n
Moderator, Webteam
Anmeldungsdatum: 15. Juli 2006
Beiträge: 5813
Wohnort: Ankh-Morpork
|
Klar, indem du sed benutzt: sed -nr 's/MemTotal:[[:space:]]+([[:digit:]]+).*/\1/p' /proc/meminfo -n unterdrückt bei sed den normalen output
-r aktiviert erweiterte Regular Expressions Und schlussendlich aktiviert das 'p' am Ende des sed-Suchstrings das Ausgeben der gefundenen Gruppe ('\1')
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
sveni-lee schrieb: Gibt es auch eine Möglichkeit nur den Wert anzeigen zu lassen?
Mit grep im Perl-Mode ist das schwierig, weil du ja eine Lookbehind-Bedingung bräuchtest, die aber eine feste Länge haben muss - mit grep ginge das nur in zwei Schritten:
grep -Po '(?<=MemTotal:)\s*\d+' /proc/meminfo | grep -Po '[^\s]+'
Mit awk hat man es IMHO etwas einfacher als mit sed:
$ awk '/MemTotal:/ {print $2}' < /proc/meminfo
3099676
|
sveni-lee
(Themenstarter)
Anmeldungsdatum: 28. Mai 2013
Beiträge: 258
|
also mit dem sed Befehl klappt das wunderbar... jetzt habe ich nur noch ein Problem mit dem Auslesen der CPU-Last | top -d 1 -b -n2 | grep "CPU(s)"|tail -n 1 | awk '{print $2 + $3 + $4}'
|
damit kann ich mir die Auslastung der CPU auf der Konsole Anzeigen lassen, aber wie mache ich das in einem script? | cpu_last=$(top -d 1 -b -n2 | grep "CPU(s)"|tail -n 1 | awk '{print $2 + $3 + $4}')
|
funktioniert nicht...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Welchen Sinn hat es top zwei Iterationen machen zu lassen, wenn du eine davon dann wieder mit tail filterst?
LANG=C top -d 1 -b -n1 | awk '/[Cc][Pp][Uu]\(s\)/ {print $2 + $3 + $4}'
|
sveni-lee
(Themenstarter)
Anmeldungsdatum: 28. Mai 2013
Beiträge: 258
|
das weiß ich nicht aber die beiden werte unterscheiden sich... | strompi@strompi:~$ top -d 1 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $3 + $4}'
1.2
|
| strompi@strompi:~$ LANG=C top -d 1 -b -n1 | awk '/[Cc][Pp][Uu]\(s\)/ {print $2 + $3 + $4}'
0.2
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Vorab: Die Feld-Nummern scheinen so nicht zu passen, $3 ist immer us, :
LANG=C top -d 1 -b -n1 | awk '/[Cc][Pp][Uu]\(s\)/ {print $2 " " $3 " " $4}'
0.2 us, 0.4
Die drei Werte, die du vermutlich haben willst, können auch bei einem System im (nahezu) Idle-Zustand durchaus stark fluktuieren::
LANG=C top -d 1 -b -n10 | awk '/[Cc][Pp][Uu]\(s\)/ {print $2 " " $4 " " $6 " Summe: " $2 + $4 + $6}'
0.2 0.4 0.0 Summe: 0.6
1.0 1.5 0.0 Summe: 2.5
0.5 1.0 0.0 Summe: 1.5
1.0 0.5 0.0 Summe: 1.5
0.5 0.5 0.0 Summe: 1
0.5 0.5 0.0 Summe: 1
0.5 1.0 0.0 Summe: 1.5
0.5 1.0 0.0 Summe: 1.5
0.0 0.5 0.0 Summe: 0.5
0.5 1.5 0.0 Summe: 2
Das kann u.a. daran liegen, dass die CPU zum Energiesparen zwischendrin heruntertaktet, oder ein laufender Prozess gerade etwas abarbeitet.
|
sveni-lee
(Themenstarter)
Anmeldungsdatum: 28. Mai 2013
Beiträge: 258
|
|
sveni-lee
(Themenstarter)
Anmeldungsdatum: 28. Mai 2013
Beiträge: 258
|
so... nach einen weile komm ich jetzt mal wieder dazu das ganze zum Abschluß bringen. zwei Werte würde ich nun noch gern auswerten:
| strompi@strompi:~$ cat /proc/loadavg
0.10 0.08 0.06 1/96 10948
|
die ersten 3 werte getrennt von einander also 3 Abfragen... | strompi@strompi:~$ df -k
Filesystem 1K-blocks Used Available Use% Mounted on
udev 55596 0 55596 0% /dev
tmpfs 24772 3092 21680 13% /run
/dev/mmcblk0p1 7583440 1230064 6262432 17% /
tmpfs 123848 0 123848 0% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 123848 0 123848 0% /sys/fs/cgroup
tmpfs 123848 0 123848 0% /tmp
log2ram 51200 2820 48380 6% /var/log
tmpfs 24772 0 24772 0% /run/user/1000
|
hier würde ich die used und available von /dev/mmcblk0p1 aber ich kommemir sed nich klar...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
sveni-lee schrieb: so... nach einen weile komm ich jetzt mal wieder dazu das ganze zum Abschluß bringen. zwei Werte würde ich nun noch gern auswerten:
| strompi@strompi:~$ cat /proc/loadavg
0.10 0.08 0.06 1/96 10948
|
die ersten 3 werte getrennt von einander also 3 Abfragen...
Das sollte in einer Abfrage gehen:
IFS=" " read -r l_1min l_5min l_15min _ _ < /proc/loadavg | strompi@strompi:~$ df -k
Filesystem 1K-blocks Used Available Use% Mounted on
udev 55596 0 55596 0% /dev
tmpfs 24772 3092 21680 13% /run
/dev/mmcblk0p1 7583440 1230064 6262432 17% /
tmpfs 123848 0 123848 0% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 123848 0 123848 0% /sys/fs/cgroup
tmpfs 123848 0 123848 0% /tmp
log2ram 51200 2820 48380 6% /var/log
tmpfs 24772 0 24772 0% /run/user/1000
|
hier würde ich die used und available von /dev/mmcblk0p1 aber ich kommemir sed nich klar...
Du musst sed ja nicht verwenden, wenn du nicht willst ☺
df -k | grep /dev/mmcblk0p1 | IFS=" " read -r device blocks used available use_percent mounted_on
|
sveni-lee
(Themenstarter)
Anmeldungsdatum: 28. Mai 2013
Beiträge: 258
|
ich muß noch mal dumm fragen, werden in diesem Fall l_1min l_5min l_15min die entsprechende werte zugewiesen also als variable?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Ja, aber das kannst du ja auch einfach ausprobieren ☺
$ IFS=" " read -r l_1min l_5min l_15min _ _ < /proc/loadavg
$ echo "$l_1min | $l_5min | $l_15min"
0.09 | 0.03 | 0.01
|