Bestimmte Zeichenfolge in Zeile ausgeben

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
OdoSimi
Beiträge: 135
Registriert: 10.02.2022 22:17:16

Bestimmte Zeichenfolge in Zeile ausgeben

Beitrag von OdoSimi » 21.02.2022 22:56:39

Hallo Gemeinde,

ich möchte mich mal Stückchenweise mit dem scripten beschäftigen. Meine Idee war jetzt ein einfaches script zu schreiben indem ich Werte aus sensors abgreife in Variablen packe und dann eben einfach visuell anders ausgebe. An dieser Stelle bitte nicht über den Sinn dieser Aktion streiten, da sensors ja genau das macht. :D

Meine Werte wären jetzt diese hier:

Code: Alles auswählen

k10temp-pci-00c3
Adapter: PCI adapter
temp1:        +65.5°C  (high = +70.0°C)
                       (crit = +100.0°C, hyst = +95.0°C)

radeon-pci-0100
Adapter: PCI adapter
temp1:        +65.0°C  (crit = +120.0°C, hyst = +90.0°C)

acpitz-acpi-0
Adapter: ACPI interface
temp1:        +60.0°C  (crit = +108.0°C)
nun bin ich zumindest so weit, dass ich über:

Code: Alles auswählen

sensors | grep temp1: |tr -s ' ' | cut -d ' ' -f 2
Folgende Ausgabe erhalte:

Code: Alles auswählen

+65.2°C
+65.0°C
+59.0°C
Ab diesem Punkt war meine Sucher nach einer Lösung erfolglos. Also jetzt noch das Problem, dass ich das ganze auf Zeilen begrenzen möchte und dann das nächste Problem, wie kann ich denn die Werte aus den Klammern abgreifen? Wenn ich versuche die werte wieder mit cut zu bekommen, hab ich ja z.b. +70.0°C) wobei ich die ")" ja gar nicht haben möchte.

Vielen Dank schonmal.

Gruß Martin

Benutzeravatar
hikaru
Moderator
Beiträge: 13946
Registriert: 09.04.2008 12:48:59

Re: Bestimmte Zeichenfolge in Zeile ausgeben

Beitrag von hikaru » 21.02.2022 23:19:58

OdoSimi hat geschrieben: ↑ zum Beitrag ↑
21.02.2022 22:56:39
Also jetzt noch das Problem, dass ich das ganze auf Zeilen begrenzen möchte
Kannst du das bitte umformulieren? Mir ist nicht klar, was dein Ziel ist.
OdoSimi hat geschrieben: ↑ zum Beitrag ↑
21.02.2022 22:56:39
und dann das nächste Problem, wie kann ich denn die Werte aus den Klammern abgreifen?
Du solltest am besten mit grep direkt das extrahieren was du haben willst, die Temperaturen, z.B. so:

Code: Alles auswählen

$ sensors | grep -o '+[0-9.]\+°C'
+65.5°C
+70.0°C
+100.0°C
+95.0°C
+65.0°C
+120.0°C
+90.0°C
+60.0°C
+108.0°C
(Ich nehme mal an, dass in deinem Rechner immer Plusgrade herrschen. Falls nicht, bitte bescheid sagen! ;) )

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Bestimmte Zeichenfolge in Zeile ausgeben

Beitrag von eggy » 21.02.2022 23:29:32

Auch wenn das für das scripting Problem wenig hilfreich ist ...
a) falls Du das Script woanders benutzen willst, achte drauf, dass auf anderen Systemen bei anderer sensors Version der Output anders aussehen kann (hier auf nem sid z.B. einzeilig)
b) manchmal bringt ein Blick in die Manpages mehr als sich umständlich das Hirn zu verknoten, zumindest in der Version hier auf sid gibt es ein "-u" und ein "-j"

OdoSimi
Beiträge: 135
Registriert: 10.02.2022 22:17:16

Re: Bestimmte Zeichenfolge in Zeile ausgeben

Beitrag von OdoSimi » 22.02.2022 14:41:28

hikaru hat geschrieben: ↑ zum Beitrag ↑
21.02.2022 23:19:58
OdoSimi hat geschrieben: ↑ zum Beitrag ↑
21.02.2022 22:56:39
und dann das nächste Problem, wie kann ich denn die Werte aus den Klammern abgreifen?
Du solltest am besten mit grep direkt das extrahieren was du haben willst, die Temperaturen, z.B. so:

Code: Alles auswählen

$ sensors | grep -o '+[0-9.]\+°C'
+65.5°C
+70.0°C
+100.0°C
+95.0°C
+65.0°C
+120.0°C
+90.0°C
+60.0°C
+108.0°C
(Ich nehme mal an, dass in deinem Rechner immer Plusgrade herrschen. Falls nicht, bitte bescheid sagen! ;) )
Das kommt der Sache schon näher!
Kannst du das bitte umformulieren? Mir ist nicht klar, was dein Ziel ist.
Damit meine ich, dass ich jetzt (nach deinem Beispiel) die Werte aus jeder Zeile einer Variablen zuordnen möchte, bspw.

Code: Alles auswählen

x1=+65.5°C
x2=+70.0°C
Wenn ich das so probieren würde

Code: Alles auswählen

x1='sensors | grep -o '+[0-9.]\+°C''
würde er mir ja die komplette Ausgabe in die Variable legen (wobei hier jetzt sicher ein Syntaxfehler drin ist, das müsste ich nochmal nachschlagen).

Edit:
Auch wenn das für das scripting Problem wenig hilfreich ist ...
a) falls Du das Script woanders benutzen willst, achte drauf, dass auf anderen Systemen bei anderer sensors Version der Output anders aussehen kann (hier auf nem sid z.B. einzeilig)
b) manchmal bringt ein Blick in die Manpages mehr als sich umständlich das Hirn zu verknoten, zumindest in der Version hier auf sid gibt es ein "-u" und ein "-j"
Na ich suche schon nach Wikis und Manuals usw. Problem (für mich) ist, dass meistens ein paar Beispiele fehlen oder genau die Beispiele fehlen die ich bräuchte. Ich habe vom Scripten bis dato keine Ahnung und versuche es jetzt learning-by-doing. Mein Ansatz oben war aus Wikis zusammengebaut die mir zielführend erschienen.

Benutzeravatar
hikaru
Moderator
Beiträge: 13946
Registriert: 09.04.2008 12:48:59

Re: Bestimmte Zeichenfolge in Zeile ausgeben

Beitrag von hikaru » 22.02.2022 15:56:58

OdoSimi hat geschrieben: ↑ zum Beitrag ↑
22.02.2022 14:41:28
Damit meine ich, dass ich jetzt (nach deinem Beispiel) die Werte aus jeder Zeile einer Variablen zuordnen möchte, bspw.

Code: Alles auswählen

x1=+65.5°C
x2=+70.0°C
Du kannst den grep-Output in einer Schleife weiterverarbeiten und dabei die Werte auf ein Array speichern:

Code: Alles auswählen

sensors | grep -o '+[0-9.]\+°C' | while read line; do x+=($line); echo ${x[$i]}; let i++; done
Beachte dabei, dass eine Pipe normalerweise eine neue Shell erzeugt, wodurch sich der Geltungsbereich der Variablen verändert! Das lässt sich aber unterbinden:

Code: Alles auswählen

shopt -s lastpipe
Ein Bash-Script, das erst alle Temperaturen in einer Schleife einliest, und sie danach in einer zweiten Schleife wieder ausgibt, könnte z.B. so aussehen:

Code: Alles auswählen

#!/bin/bash

shopt -s lastpipe

sensors | grep -o '+[0-9.]\+°C' | while read line
do
        x+=($line)
        let i++
done

for j in "${x[@]}"
do
        echo $j
done
Natürlich kannst du in der zweiten Schleife auch komplexere Sachen machen, als nur eine einfache Ausgabe. Oder du ersetzt diese Schleife vollständig und arbeitest nur gezielt auf einzelnen Indizes des Arrays.

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Bestimmte Zeichenfolge in Zeile ausgeben

Beitrag von eggy » 22.02.2022 16:01:54

@OdoSimi: Ich hab auch nicht sagen wollen, dass das der Ansatz komplett falsch ist. Wollt nur sagen, dass "sensors -u" vielleicht der bessere Start sein könnte. Und, dass man (muss nicht für Dich gelten) oft vergisst, dass es häufig nen einfacheren Weg oder zumindest besseren Anfang gibt als den, der einen direkt anspringt.
Aus eigener Erfahrung, manchmal sieht man den Wald vor lauter Bäumen nicht, oder verrennt sich im Scriptingwahn erstmal völlig - bis man den Krams mal ne Weile weglegt und einem dann auffällt, dass es "anders" einfacher geht, geht mir jedenfalls ab und an so.

Wenn Du nen Wikitext hast, bei dem Dir nen Beispiel zum Verständnis fehlt, einfach mal den Link posten, hier gibts einige, die auf solche Fragen gradezu lauern (man muss nur ausreichend Forencookies zur Bestechung versprechen, um die anzulocken).

OdoSimi
Beiträge: 135
Registriert: 10.02.2022 22:17:16

Re: Bestimmte Zeichenfolge in Zeile ausgeben

Beitrag von OdoSimi » 22.02.2022 20:07:24

Das muss ICH jetzt erstmal verarbeiten. :mrgreen:

Okay, also mal noch ein paar Fragen dazu, ich möchte es ja auch verstehen.

Die Pipe übergibt die Informationen von Befehl zu Befehl, soweit klar. Wenn ich das richtig verstanden habe, ist die Pipe in dem Kommando eine unnamed Pipe. Deswegen versteh ich den Punkt hier nicht so ganz:
Beachte dabei, dass eine Pipe normalerweise eine neue Shell erzeugt, wodurch sich der Geltungsbereich der Variablen verändert!
Wäre das nicht bei einer named Pipe der Fall? Und was bedeutet in dem Zusammenhang der Geltungsbereich der Variable?

Das nächste wäre dann dieses Kommando:

Code: Alles auswählen

shopt -s lastpipe
Da hab ich jetzt keine (für mich einleuchtende) Erklärung zu gefunden.

Dann zum grep, was bewirkt der "\" fehlt hier nicht ein "<"? EDIT: Beim while read line ist das "line" hier eine Variable oder eine Anweisung zum lesen der Zeilen? Das hab ich rausgefunden /EDIT i++ entspricht hier sozusagen einem i=i+1, oder? Über das "x+" lass ich dann auch nur einen Index von 0 bis n laufen, richtig? Und bei der for-Schleife definiert sich das j über den Index von x, das Argument dazu ist das @?

@eggy
Alles gut, mir ist schon klar, dass man aus den Fragestellungen nicht unbedingt ableiten kann, ob sich der Verfasser vorher mit dem Thema beschäftigt hat oder einfach nur eine bequeme Antwort möchte. Für jemanden wie mich, der bei dieser Thematik völlig unbeleckt ist, sind die man pages aber teilweise zu allgemein gehalten. Wenn man erstmal eine Basis hat, lässt sich damit auch bedeutend besser arbeiten.

Gruß Martin

Antworten