[Shellscript] In einer Zeile nach einem Wort suchen

betaros

betaros

Computerspezi
Moin,

ich bin grade dabei ein kleines Shellscript zu schreiben,mit dem ich in der Lage bin mit lspci herauszufinden welche Grafikkarte verbaut ist. Jedoch komme ich da nicht wirklich weiter. Er gibt mir nämlich immer nur eine Zeile aus, statt den Grafikkartenhersteller.

Hier mal mein Versuch:
Code:
#!/bin/bash
lspci | grep VGA > buffer.txt
cat buffer.txt | grep nVidia

Bin über jede Hilfe dankbar :)

mfg
betaros
 
Schau dir doch erstmal an, was in die buffer.txt geschrieben wird. Ggf. ist da der String 'nVidia' garnicht drin oder hat eine andere Schreibweise. Im uebrigen ist der zweite Befehl ein typisches Beispiel fuer ein "useless cat". Einfach 'grep nVidia buffer.txt' tut's auch.

Code:
barlin:~ # lspci | grep VGA > buffer.txt
barlin:~ # grep nVidia buffer.txt 
01:00.0 VGA compatible controller: nVidia Corporation NV44 [GeForce 6200 TurboCache(TM)] (rev a1)
 
Bei den vielen möglichen Schreibweisen für NVidia würde ich grep zudem den Parameter '-i' mit auf den Weg geben.
 
Moin,

danke für die Hilfe :)

Ich war heute auch beim LUG in unserer Stadt, wo ich Mitglied bin und hab mich dort vorangebastelt. Allerdings bin ich immernoch nicht da, wo ich sein will. Vielleicht hab ich auch noch nicht so richtig beschrieben, welchen Sinn das Ganze haben soll.

Also er soll automatisch herausfinden, welcher Hersteller die Grafikkarte hergestellt hat und dann den passenden Treiber automatisch installieren. Insgesamt wird das ein Installationsscript für Archlinux Im groben soll es so aussehen:
Code:
finde mit 'lspci' Grafikkartenhersteller heraus
if [Grafikkartenhersteller == Nvidia]
  then pacman -S nvidia
elif [Grafikkartenhersteller == Ati]
  then pacman -S ati
elif [Grafikkartenhersteller == Intel]
  then pacman -S intel
else
  pacman -S vesa
fi

Ich hoffe, dass es jetzt verständlicher ist, was ich vor habe :D

Und hier mal, was ich im LUG gebastelt habe (test.sh):
Code:
#!/bin/bash
lspci | grep VGA > buffer.txt
cat buffer.txt | grep Intel > buffer.txt
cat buffer.txt
wc -m buffer.txt | cut -c 1-2 > buffer.txt
cat buffer.txt
if [ "cat buffer.txt" = "0 " ]
	then
		echo "Sie haben keine Intel Grafikkarte"
	else
		echo "Sie haben eine Intel Grafikkarte"
fi

Jedoch gibt er immer aus, dass ich eine Intel Grafikkarte habe... Habt ihr noch Ideen?

mfg
betaros
 
Zuletzt bearbeitet:
Eben versteh ich was du willst. Grep kennt die Option -o
Code:
  -o, --only-matching       show only the part of a line matching PATTERN
 
Hoi,

eventuell könnte man das Ganze ja so angehen:

Code:
#!/bin/bash


VGA_INFO=$(lspci | grep VGA)

while read DRIVER VENDOR <&3; do
        echo "$VGA_INFO" | grep -i " $VENDOR " && break
done 3<<- !
        intel   Intel
        ati     Ati
        nvidia  nVidia
        matrox  Matrox
!

echo "Found a(n) ${VENDOR:-unknown} VGA adapter"

und dann halt die Liste von Treibern und Herstellern/Typen entsprechend ergänzen ...

Gruss, A.

(NB: die Spaces im grep-Pattern innerhalb der Schleife sollen nur verhindern, dass irgendwelche "VGA compatible" Adapter den ATI-Treiber verpasst bekommen ;)
 
Zuletzt bearbeitet:
Moin,

@floyd62: Vielen Dank :D Es funktioniert einwandfrei! Ich bin ja noch am lernen von Shellscripting. Kannst du mir erklären, was das Script an sich macht? Weil bis jetzt sehe ich da noch nicht so richtig durch...

Vielen Dank euch allen für die schnelle Hilfe :)

mfg
betaros
 
Hi,

ganz kurz:

- mit VGA_INFO=$(...) hole ich aus dem Output von lspci die Zeile(n) zur VGA-Karte in eine Variable;
- dann definiere ich mir eine Tabelle von Graka-Treibern und Herstellern, die ich in ein Here-Document packe und zeilenweise in eine while-Schleife füttere;
- innerhalb der Schleife prüfe ich ab, ob die Graka-Info den gerade zu prüfenden Hersteller ($VENDOR) enthält, und
- springe mit "break" aus der Schleife, ist das der Fall (also sobald grep einen Exit-Status = 0 liefert);
- dann habe ich nach der Schleife entweder den Hersteller in $VENDOR und den passenden Treiber in $DRIVER, oder eben nichts in den beiden Vars, wenn in der Tabelle keine passenden Daten enthalten waren.

Man könnte an das Beispiel also dann noch etwas wie
Code:
[ "$DRIVER" ] && {
        pacman -S "$DRIVER" 
} || {
        echo "Sorry, no driver for $VGA_INFO"
}
anhängen ...

Hoffe, das hilft dir erst einmal weiter.

Gruss,
A.
 
ich würde eine Case-Abfrage dazu verwenden.....
Code:
finde mit 'lspci' Grafikkartenhersteller heraus
case Grafikkartenhersteller in
   Nvidia|nvidia|NVIDIA) pacman -S nvidia ;;
   [aA][tT][iI]) pacman -S ati ;;
   Intel) pacman -S intel ;;
   *) pacman -S vesa ;;
esac
 
dein Script gab immer Intel aus, weil in dieser Zeile was schief laeuft
wc -m buffer.txt | cut -c 1-2 > buffer.txt
und danach in buffer.txt immer 0 steht, ohne Ausgabeumleitung tuts,
vermutlich hat wc die Datei noch offen waehrend cut schon rein schreiben
will.
 
Moin,

vielen Dank euch allen. :D

Danke für das Script und die Erklärung. Hab ich wieder was gelernt :)

mfg
betaros
 
Also, wenn das o.a. Skript wirklich die Originalversion darstellt, reicht es, sich nur die if-Abfrage selbst anzusehen, um festzustellen, warum immer 'ne Intel-Graka gefunden wird: mit
Code:
if [ "cat buffer.txt" = "0 " ]
werden schliesslich ganz einfach die Strings "cat buffer.txt" und "0" verglichen, und da die (a) fix und (b) definitiv unterschiedlich sind, wird einfach immer der else-Zweig angesteuert ...

Was davor mehrmals im Skript versucht wird, und in der Shell einfach nicht funktionieren kann, ist, eine Datei (im Bsp. die "buffer.txt") zum einen als Eingabe für Kommandos (oder eine Pipe) zu verwenden, und die Ergebnisse davon dann in dieselbe Datei zurückzuschreiben. Die Shell geht da ja schliesslich nicht von links nach rechts vor, sondern die nach der Ausgabeumlenkung (">)" angegebene Datei wird zunächst einmal zum Schreiben geöffnet und dabei neu angelegt bzw. auf Länge 0 gebracht (mit creat(2)), und erst danach wird versucht, die angegebenen Kommandos auszuführen.

Das heisst konkret, dass z.B. in Zeile 3 die Datei für den "cat" schon mal leer ist, und daher darin nie ein "Intel" stehen wird. In Zeile 5 dasselbe: die buffer.txt ist leer, wenn "wc" dvon liest, daher Ergebnis immer 0 ...

Also: wenn sich temporäre Datein nicht sowieso etwa durch Festhalten von Zwischenergebnissen in Variablen ganz vermeiden lassen, sollte man damit wenigstens nicht am falschen Ende sparen. Zur Not schreibt man etwas wie
Code:
wc -m buffer.txt | cut -c 1-2 > buffer.txt.$$; mv buffer.txt.$$ buffer.txt

(... und jetzt verzieht der kleine Klugscheisser sich wieder in seine Ecke.)

Gruesse :)
A.
 

Ähnliche Themen

Maskiertes Suchen, Ersetzen und Rechnen in access.log vor weitere Bearbeitung

Zeile an txt anhängen

Debian stable bleibt bei "io scheduler cfq registered (default)" haengen

Internet ist ploetzlich weg

Server-Monitoring mit RRDTool

Zurück
Oben