Datei via BASH auslesen

O

OSP-User

Eroberer
Hallo...

also ich fang mal gleich munter an!
Ich programmiere gerade an einer BASH Datei, die die "/proc/cpuinfo", die "/proc/meminfo" und noch einige andere auslesen soll.
ich weiß, dass dies mit grep ohne weiteres möglich ist allesdings habe ich bisher nur die komplette Zeilen auslesen in der das gesuchte wort steht können.
Da meines Wissen die cpuinfo immer gleich aufgebaut ist dachte ich mir jetzt ich könnte ja fest vorgeben, welche Zeile und ab welchem Zeichen er den Text übernehmen soll. Ich hoffe ihr versteht mich :think: und ich hab mich nicht zu kompliziert ausgedrückt.

Nochmal in kurz: Ich will von der Datei /proc/cpuinfo die Zeile "model name" auslesen und suche einen befehl der dies macht. Der rausgezogene Wert (CPU name) soll dann in einer Textdatei abgespeichert werden.

Vielen Dank für eure Bemühungen.
 
Code:
grep "model name" /proc/cpuinfo | cut -d ":" -f 2
 
Hallo
mit sed:
sed -e '/^model name/!d;{s/.*:.//g;}' /proc/cpuinfo >zieldatei


Gruß Wolfgang
 
Super Leute ich glaube ich habe mich zurecht hierher verirrt!! :D

Mit allen drei möglichkeiten hab ich es hinbekommen ... vielen vielen dank

*great*
 
Hallo
Die vierte Möglichkeit wär dann noch das nicht zu vergessende perl. ;)
perl -naF":\s" -e '(/^model name/g)?print$F[1]:1' /proc/cpuinfo >zieldatei

:D :D :D :D
Gruß Wolfgang
 
Hallo hallo bin wieder da mit ner dummen Frage *g*
Also hier mein Codeschnipsel
Code:
{
   for i in $ir; do
      Bearbeitet=$Bearbeitet+1
      echo $(($Bearbeitet * 100 / $Anzahl))
      sed -e '/^model name/!d;{s/.*:.//g;}' $i >> etc/tmp.txt
	#Überprüft gefundene Dateien auf den Eintrag "model name"
      sed -e '/^vendor_id/!d;{s/.*:.//g;}' $i >> etc/tmp.txt
	#Überprüft gefundene Dateien auf den Eintrag "vendor_id"
   done
} | dialog --gauge "Überprüfe Hardware..." 6 40 0

Ich denke mal ich muss euch nicht erklären was der macht !! :))

nun haut das auch super hin ... naja fast ... ich hätte gerne noch, dass ich einen Wert angeben kann, der dann vor das ausgelesenen geschrieben wird (um das alles noch komplizierter zu machen... später will ich das noch in HTML schreiben damit man nen Testbericht hat *g* ... aber das später ;) )
so wie gesagt ich wollte das vor dem Prozessor noch "Prozessor: " steht usw.
also hab ich mir das so gedacht.

Code:
 {
   for i in $ir; do
      Bearbeitet=$Bearbeitet+1
      echo $(($Bearbeitet * 100 / $Anzahl))
      sed -e '/^model name/!d;{s/.*:.//g;}'[color=red]"Prozessor: "$i[/color] >> etc/tmp.txt
	#Überprüft gefundene Dateien auf den Eintrag "model name"
      sed -e '/^vendor_id/!d;{s/.*:.//g;}'[color=red]"Hersteller: "$i[/color] >> etc/tmp.txt
	#Überprüft gefundene Dateien auf den Eintrag "vendor_id"
   done
} | dialog --gauge "Überprüfe Hardware..." 6 40 0
Ja aber das funktioniert gar nicht *noahnung*. hat einer ne Idee?

Ich kann nicht echo "Hersteller: " >> etc/tmp.txt vorschreiben weil es das dann verdammt oft hinschreibt! ist ne art schleife.

Also hat einer ne Idee?
 
Code:
...
echo "Prozessor: " $(sed -e '/^model name/!d;{s/.*:.//g;}'$i) >> etc/tmp.txt
...

Gruss, Phorus
 
Hallo
Ja ich habe eine Idee:

..
sed -e '/^model name/!d;{s/.*:./Prozessor: /g;}'$i >> etc/tmp.txt
...

Zweite Ersetzung und folgende dann entsprechend dto.

Aber wenn du das als html planst, ist perl eventuell gleich die bessere Lösung.

Gruß Wolfgang
 
Bei PEARL bin aber noch dümmer!!:hilfe2: da hab ich nu wirklich keinen plan von!
 
sed -e '/^model name/!d;{s/.*:./Prozessor: /g;}'$i >> etc/tmp.txt

wolfgang_1

wäre es vielleicht möglich, dass du mir kurz mal den Befehl aufschlüsselst ?

quasi welche Option sagt was aus ? Im Internet hab ich bisher noch nichts dazu gefunden? *blödes google*

danke
 
Hallo
Eine recht gute Einführung findest du hier->
http://www-128.ibm.com/developerworks/linux/library/l-sed1.html

Kurz zu diesem Einzeiler:
sed -e '/^model name/!d;{s/.*:./Prozessor: /g;}'

- Lies von der STDIN

- führe den Code zwischen den ['] aus. -> Option -e

Lösche Alles was nicht auf den Regulären Ausdruck /^model name/ passt -> !d;
Der Regexp sucht hier nach einer Zeichenfolge am Anfang der Zeile ^

Was in den geschweiften Klammern steht, wird nun auf den verbliebenen Rest angewendet.
Der Rest ist genau die noch komplette Zeile die wir suchen.
Also so wie sie uns auch grep liefern würde.

s/.*:.//g;
Ersetzt alles in dieser Zeile, was:

irgend ein Zeichen (ausser Newline) einmal oder unendlich vielmal vorkommend,
gefolgt von einem Doppelpunkt,
gefolgt von noch einem Zeichen (hier unser Leerzeichen)

durch Nichts. Also simples Löschen.

Damit bleibt alles was nach dem Doppelpunkt Leerzeichen Steht übrig.

s/.*:./Prozessor: /g;

Im Zweiten Fall ersetze ich das eben nicht durch Nichts, sondern deinen gewünschten String Prozessor :, der damit vor der CPU Angabe landet.

Hoffe verständlich gewesen zu sein.
Reguläre Ausdrücke sind unter *nix sehr nützlich.

Gruß Wolfgang

PS Das g bedeutet, auf die gesamte Zeile anwenden.
 
Danke sehr Wolfgang ... jetzt hab selbst ich das verstanden :D
 
Hey Leute ... hab nochmal ne Frage.

So ich möchte mit folgendem Befehl den Cache (NUR die Zahl) des Optical auslesen.
Code:
dmesg | grep hdd

Leider spuckt er mir dort viel zu viel aus und ich will die ausgabe jetzt nur auf die Zahl begrenzen!

Ist das möglich und wenn ja ... wie?:think:

Danke für eure Bemühungen :D
 
Hilfe zur Selbsthilfe:

Code:
man bash
man grep
man sed
man awk
man cut

Gruss, Phorus
 
Hallo
Leider versteh ich nicht was du meinst.
Gib doch mal Beispieldaten und was du darus filtern willst.
dmesg liefert eine Menge Zahlen.
Ohne zu wissen welche Zahl du meinst kann ich nicht helfen.

Gruß Wolfgang
 
jaa ich geb zu ich hab euch eigentlich nicht wirklich viele fakten gegeben. Ich wollte den Cache von CD Laufwerken auslesen. Das hab ich jetzt über dmseg gemacht.
Habs aber schon hinbekommen. Trotzdem danke ... wird sicher nicht die letzte frage gewesen sein!

thx
 
Hallo und wieder ein Frage.

Also ich will eine Datei ( $target ) auf der ganzen Festplatte ( / ) suchen und die soll dann in eine Datei ( lib/backup.log ) hineingeschrieben werden.
Hört sich einfach an. Ist es aber irgendwie nicht so ganz.

Also ich hab bisher folgenden quelltext
Code:
find $target >> lib/backup.log
Er findet zwar dann die gesuchte Datei, gibt sie jedoch nur mit dem Dateinamen aus. Ich hingegen möchte auch den pfad wissen.
Also so gibt er es aus:
hier.txt
Und so soll es sein:
/ziel/liegt/hier.txt

hab schon im Manual von find geguckt aber nix passendes gefunden.

thx
 
Hallo

Wenn du in die man find gesehen hast, dann hast du aber

-fprint file
-fprintf file format
;)

übersehen.
Das erledigt genau das was du suchst. ;)
Gib einfach den vollen Pfad an.

find / -name "foobar" -fprint /var/log/files.log 2>/dev/null

Gruß Wolfgang
 
Um diese alte Thema mal wieder aufzugreifen:
Ich würde gerne aus einer txt-Datei, die unter anderem diese Zeilen enthält:

endtime: 1394442870
duration: 53
setstatus stop - ok


nur die Zahl hinter duration auslesen und das dann in eine neue Datei schreiben.
Das ganz möchte ich für mehrere Dateien machen.
Das Skript, was ich schrieb, sieht so aus:

#!/bin/bash
for i in run*;
do

sed -e '/^duration/!d;{s/.*://g}'>>horst.txt;

done

Funktioniert aber nicht so richtig... ;-)
Ich frage mich nun, warum?
Habt ihr eine Idee?

Herzlichst!
 

Ähnliche Themen

Shell-Script zum auslesen von Dateien aus versch. Verzeichnissen

Server-Monitoring mit RRDTool

Zurück
Oben