[Shellscript] In einer Zeile nach einem Wort suchen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von betaros, 14.05.2010.

  1. #1 betaros, 14.05.2010
    betaros

    betaros Computerspezi

    Dabei seit:
    02.02.2008
    Beiträge:
    181
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bitmuncher, 14.05.2010
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    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)
    
     
  4. #3 gropiuskalle, 14.05.2010
    gropiuskalle

    gropiuskalle terra incognita

    Dabei seit:
    01.07.2006
    Beiträge:
    4.857
    Zustimmungen:
    0
    Ort:
    Berlin
    Bei den vielen möglichen Schreibweisen für NVidia würde ich grep zudem den Parameter '-i' mit auf den Weg geben.
     
  5. #4 betaros, 14.05.2010
    Zuletzt bearbeitet: 14.05.2010
    betaros

    betaros Computerspezi

    Dabei seit:
    02.02.2008
    Beiträge:
    181
    Zustimmungen:
    0
    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
     
  6. #5 HeadCrash, 15.05.2010
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Eben versteh ich was du willst. Grep kennt die Option -o
    Code:
      -o, --only-matching       show only the part of a line matching PATTERN
    
     
  7. #6 floyd62, 15.05.2010
    Zuletzt bearbeitet: 15.05.2010
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    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 ;)
     
  8. #7 betaros, 15.05.2010
    betaros

    betaros Computerspezi

    Dabei seit:
    02.02.2008
    Beiträge:
    181
    Zustimmungen:
    0
    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
     
  9. #8 floyd62, 16.05.2010
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    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.
     
  10. HBtux

    HBtux Linuxer

    Dabei seit:
    13.04.2010
    Beiträge:
    72
    Zustimmungen:
    0
    Ort:
    $HOME
    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
    
     
  11. Rvg

    Rvg Doppel-As

    Dabei seit:
    11.07.2004
    Beiträge:
    141
    Zustimmungen:
    0
    dein Script gab immer Intel aus, weil in dieser Zeile was schief laeuft
    und danach in buffer.txt immer 0 steht, ohne Ausgabeumleitung tuts,
    vermutlich hat wc die Datei noch offen waehrend cut schon rein schreiben
    will.
     
  12. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  13. #11 betaros, 17.05.2010
    betaros

    betaros Computerspezi

    Dabei seit:
    02.02.2008
    Beiträge:
    181
    Zustimmungen:
    0
    Moin,

    vielen Dank euch allen. :D

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

    mfg
    betaros
     
  14. #12 floyd62, 17.05.2010
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    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.
     
Thema: [Shellscript] In einer Zeile nach einem Wort suchen
Besucher kamen mit folgenden Suchen
  1. linux erstes wort einer zeile suchen

Die Seite wird geladen...

[Shellscript] In einer Zeile nach einem Wort suchen - Ähnliche Themen

  1. Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen

    Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen: Hallo, ich habe ein Verzeichnis, darin enthalten sind mehrere Dateien. Nun möchte ich alle Dateien (Parameter $1) gegen eine konstante Datei...
  2. 2 Zeilen aus einer txt auslesen

    2 Zeilen aus einer txt auslesen: Hallo Leute, ich habe eine Datei die immer aus zwei zusammenhängenden Zeilen besteht, als Beispiel: DE0006231004 # 15,04 Infineon DE0005785604...
  3. Shell-Skript Datum in einer Datai suchen

    Shell-Skript Datum in einer Datai suchen: Hallo zusammen Ich komm eigentlich aus der Klicki-Bunti-Welt von Windows. Seit geraumer Zeit versuche ich meine Künste mit verschiedenen...
  4. Timestamp an Inhalt einer Textdatei anfügen

    Timestamp an Inhalt einer Textdatei anfügen: Hallo, ich als neuer, unerfahrener Nutzer von Linux und der bash hätte folgende Frage. Und zwar würde ich gerne mit einem command den Zeitstempel...
  5. VoCore: Kleiner Open-Source-Platinenrechner mit OpenWrt

    VoCore: Kleiner Open-Source-Platinenrechner mit OpenWrt: VoCore ist Open Source, was Hard- und Software betrifft, kostet 20 US-Dollar und setzt beim Basteln eine Stufe tiefer an als der Raspberry Pi....