Läsa från fil i Bash.

Tråden skapades och har fått 3 svar. Det senaste inlägget skrevs .
1

Jag har en textfil med en del rader i

123463
233445
234564
123463
233445
234564

Jag vill läsa in rad för rad i ett shell script och köra ett antal kommndon...

read <&3 | specialping $radinfon > result.txt

Resultatet jag får från detta special kommndo vill jag skjuta ut i en fil så det ser ut så här:

från fil från specilkommando
123463 alive
233445 dead
234564 dead
123463 alive
233445 alive
234564 dead

Det hela ska sluta i:

$ ./testping.sh < testlist.txt
$ more testping.txt
123463     alive
233445     dead
234564     dead
123463     alive
233445     alive
234564     dead
$ |

Hur går jag tillväga?
Antar att detta är en utmaning även för det mer vana UNIX adminarna...

Då har jag löst inläsningen i alla fall det som jag trodde skulle vara det svåraste...
skönt att se att hjärnan är med trots att kl är efter 15 på en fredag.

file="test.txt";
row="";

while [ 1 ]
        do
                read row || echo "Guru Meditation"; break
                echo "$row";
        done < $file;

På nästa problem...

  • Medlem
  • Kiruna
  • 2005-04-22 16:19

Hmm... Hängde inte helt med i din beskrivning, men jag tolkar det som att du vill köra ett kommando ett antal gånger och hämta argumenten från en fil, och då är ju xargs lämpligt att använda:

xargs -n 1 kommando < källfil.txt

Detta exekverar kommandot "kommando" och hämtar ett (1) nytt argument från källfilen för varje gång. Vill du hämta fler än ett argument, ändra då värdet efter flaggan -n. För att spara eventuellt resultat till en fil är det bara att dirigera om, i ditt fall exempelvis så här:

xargs -n 1 specialping < testlist.txt > result.txt

  • Medlem
  • Stockholm
  • 2005-04-22 16:05

Kul att du löste problemet, ibland är det precis när man ställt frågan man kommer på svaret. En variant som jag hackade ihop:

#!/usr/local/bin/bash
rm -f out.txt
while read ip;
  do
    echo "I read: $ip" >> out.txt;
  done

Funkar som ditt önskade exempel ./testping.sh < testlist.txt och producerar en out.txt. Om du sen funderar på hur du pingar ett gäng burkar och får ut levande/död status, prova något som:

if ping -q -t 5 -c 1 192.168.0.1; then echo alive; else echo dead; fi

Det kommer lite extra utskrifter från ping som du får filtrera bort, annars funkar det bra.

/Stefan

1
Bevaka tråden