Anzeige:
Ergebnis 1 bis 9 von 9

Thema: bash: lesen, bestimmte Zeile suchen...ausgeben ?

  1. #1
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39

    bash: lesen, bestimmte Zeile suchen...ausgeben ?

    Hallo,

    ich habe eine datei, mit diesem Inhalt:
    PC1:192.168.0.101
    PC2:192.168.0.102
    PC3:192.168.0.103
    usw.

    wenn ich das hier mache...
    Code:
    pc=$(cat datei | cut -d\: -f1)
    
    echo $pc 
    PC1 PC2 PC3 
    
    ip=$(cat ok | cut -d\: -f2)
    
    echo $ip
    192.168.0.101 192.168.0.102 192.168.0.103
    ....habe ich $pc und $ip getrennt

    Code:
    ip_lesen_von = "PC2|PC3"
    wie kann ich jetzt die $ip nur von PC2 und PC3 (oder PC3 und PC1) $finden...?
    mein denken hört hier auf...

    MfG,
    Roki
    Geändert von Roki (05-03-2012 um 20:34 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87
    Geh einfach über eine temporäre Datei, die du mit egrep anlegst
    PHP-Code:
    echo -"PC1:192.168.0.101\nPC2:192.168.0.102\nPC3:192.168.0.103\n" daten
    ip_lesen_von
    ="PC2|PC3"
    egrep $ip_lesen_von daten out.$$
    pc=$(cat out.$$ | cut -d\: -f1)
    echo 
    $pc
    ip
    =$(cat out.xx cut -d\: -f2)
    echo 
    $ip 

  3. #3
    Registrierter Benutzer
    Registriert seit
    06.03.2012
    Beiträge
    3
    Oder mit diesem schicken Einzeiler:
    Code:
    for i in $(echo "PC3|PC1" | sed "s/|/\n/g"); do awk -F : '/'"$i"'/ {print $2}' daten; done
    wobei daten die von Thorsten erzeugte Beispieldatei ist.

    Thomas

  4. #4
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39
    woow ! Danke!

    ich habe es so hin bekommen:

    cat datei
    PC1:192.168.2.140
    PC2:192.168.2.141
    PC3:192.168.2.142
    PC4:192.168.2.143

    Code:
    cat datei | awk /PC2\|PC4/ | cut -d\: -f2 | while read zeile; do echo $zeile; done
    
    192.168.2.141
    192.168.2.143
    ...?

    Code:
    echo -e "PC1:192.168.0.101\nPC2:192.168.0.102\nPC3:192.168.0.103\n" > daten
    ip_lesen_von="PC2|PC3"
    egrep $ip_lesen_von daten > out.$$
    pc=$(cat out.$$ | cut -d: -f1)
    echo $pc
    ip=$(cat out.xx | cut -d: -f2)
    echo $ip
    also das mit egrep und diesen hier "out.$$" merke ich mir...! Danke!

    MfG,
    Roki

  5. #5
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87
    Ok, wenn du jetzt awk nutzt, dann laß dich mal hiervon inspirieren:
    PHP-Code:
    $ echo -"PC1:192.168.0.101\nPC2:192.168.0.102\nPC3:192.168.0.103\n" daten
    ip_lesen_von="PC2|PC3"
    awk -F':' -var=$ip_lesen_von 'match($1,var){print $2}' daten
    192.168.0.102
    192.168.0.103 

  6. #6
    Registrierter Benutzer
    Registriert seit
    06.03.2012
    Beiträge
    3
    match kannte ich gar nicht, Danke. awk ist einfach genial.

    Thomas

  7. #7
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39
    Zitat Zitat von ThorstenS Beitrag anzeigen
    Ok, wenn du jetzt awk nutzt, dann laß dich mal hiervon inspirieren:
    PHP-Code:
    $ echo -"PC1:192.168.0.101\nPC2:192.168.0.102\nPC3:192.168.0.103\n" daten
    ip_lesen_von="PC2|PC3"
    awk -F':' -var=$ip_lesen_von 'match($1,var){print $2}' daten
    192.168.0.102
    192.168.0.103 
    also, einfach und genial! Danke...!

    MfG,
    Roki

  8. #8
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39
    jetzt stehe ich vor nächsten Problem
    Code:
    ip_liste=$(cat datei | cut -d\: -f2)
    for ip in $ip_liste
    do
         if $(ping -c 1 -w 1 $ip >/dev/null); then
                 pc_liste=`for i in $(echo "$ip" | sed "s/|/\n/g"); do awk -F : '/'"$i"'/ {print $1}' ok; done`
                 pc_liste=`for i in $pc_liste; do echo "TRUE $i"; done`
                 echo "$ip erreichbar..."
         else
                 echo "$ip nicht erreichbar..."
         fi
    done
    also nur von den anpingbare IPs die Hostnamen ausgeben und davor "TRUE" setzen... und das ganze der Variable(array?) $pc_liste zuweisen....

    so sollte es ungefähr aussehen:
    TRUE PC1
    TRUE PC2
    TRUE PC3

    es wird aber nur:
    TRUE PC3 ausgegeben...

    was mache ich falsch?

    MfG,
    Roki
    Geändert von Roki (10-03-2012 um 11:49 Uhr)

  9. #9
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39
    naja, ich habe das ganze jetzt so hin bekommen;
    PHP-Code:
    ip_liste=($(cat datei cut -d\: -f2))

    for 
    ip in ${ip_liste[*]}
    do
            if (`
    ping -c 1 -w 1 $ip >/dev/null`); then
                    ips
    =$(for i in $(echo "$ipsed "s/|/\n/g"); do awk -'/'"$i"'$/ {print $1}' dateidone)
                    echo 
    "TRUE $ips>> ping_ok 
            
    else
                    echo 
    "$ip nicht erreichbar..."
            
    fi
    done 
    cat ping_ok

    TRUE PC1
    TRUE PC2
    TRUE PC3



    nochmal Vielen Dank für den schicken Einzeiler und für die geniale Inspiration....

    MfG
    Roki
    Geändert von Roki (12-03-2012 um 15:51 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •