PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash: lesen, bestimmte Zeile suchen...ausgeben ?



Roki
05-03-2012, 21:28
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

Roki
06-03-2012, 20:32
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

Roki
08-03-2012, 18:08
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

Roki
10-03-2012, 12:01
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

Roki
12-03-2012, 16:34
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