Archiv verlassen und diese Seite im Standarddesign anzeigen : 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...
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
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
ThorstenS
06-03-2012, 15:07
Geh einfach über eine temporäre Datei, die du mit egrep anlegst
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
Thomas Henkel
06-03-2012, 19:10
Oder mit diesem schicken Einzeiler:
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
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
cat datei | awk /PC2\|PC4/ | cut -d\: -f2 | while read zeile; do echo $zeile; done
192.168.2.141
192.168.2.143
...? :)
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
ThorstenS
07-03-2012, 16:30
Ok, wenn du jetzt awk nutzt, dann laß dich mal hiervon inspirieren:
$ echo -e "PC1:192.168.0.101\nPC2:192.168.0.102\nPC3:192.168. 0.103\n" > daten
$ ip_lesen_von="PC2|PC3"
$ awk -F':' -v var=$ip_lesen_von 'match($1,var){print $2}' daten
192.168.0.102
192.168.0.103
Thomas Henkel
07-03-2012, 20:43
match kannte ich gar nicht, Danke. awk ist einfach genial.
Thomas
Ok, wenn du jetzt awk nutzt, dann laß dich mal hiervon inspirieren:
$ echo -e "PC1:192.168.0.101\nPC2:192.168.0.102\nPC3:192.168. 0.103\n" > daten
$ ip_lesen_von="PC2|PC3"
$ awk -F':' -v 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
jetzt stehe ich vor nächsten Problem :(
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
naja, ich habe das ganze jetzt so hin bekommen;
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 "$ip" | sed "s/|/\n/g"); do awk -F : '/'"$i"'$/ {print $1}' datei; done)
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.