Soort explode voor bash

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • DumbAss
  • Registratie: April 2002
  • Laatst online: 16-08 11:30
Normaal gesproken programmeer ik veel in php, maar voor een backup-script was ik wat met bash aan het spelen.

Vanuit een bestandje krijg ik host, user en ww terug van een account. In de vorm van dit:
code:
1
2
server.domein.nl  user    wachtwoord
server.domein.nl  user2   wachtwoord2

Values gescheiden door tabs. Nu look ik met een for-loop ieder regel drie keer door, om deze in aparte variabelen te zetten. Is het mogelijk om, met een soort explode, deze in één keer in een array te zetten?
Bijvoorbeeld:
code:
1
test_array=explode $i;

Vanutsteen.nl => nerds only | iRacing


Acties:
  • 0 Henk 'm!

Verwijderd

DumbAss schreef op vrijdag 19 mei 2006 @ 09:05:
Normaal gesproken programmeer ik veel in php, maar voor een backup-script was ik wat met bash aan het spelen.

Vanuit een bestandje krijg ik host, user en ww terug van een account. In de vorm van dit:
code:
1
2
server.domein.nl  user    wachtwoord
server.domein.nl  user2   wachtwoord2

Values gescheiden door tabs. Nu look ik met een for-loop ieder regel drie keer door, om deze in aparte variabelen te zetten. Is het mogelijk om, met een soort explode, deze in één keer in een array te zetten?
Bijvoorbeeld:
code:
1
test_array=explode $i;
zo iets?
code:
1
2
3
4
5
6
while read domein user pass
do
    array[0]=$domein
    array[1]=$user
    array[2]=$pass
done < list.txt

Acties:
  • 0 Henk 'm!

  • Wilke
  • Registratie: December 2000
  • Laatst online: 16:52
Tjonge, weer iets nieuws geleerd.

Wist niet eens dat bash arrays had.

Maar het kan dus wel:

code:
1
2
3
4
5
6
7
8
#!/bin/sh

array=(`awk '{print $1,$2,$3}'  accounts-file.txt`)

echo ${array[0]} # print: "server.domein.nl"
echo ${array[1]} # print: "user"
echo ${array[2]} # print: "wachtwoord"
echo ${array[3]} # print "server.domein.nl"


Etc. Bash ondersteunt alleen 1-dimensionale arrays, dus je moet dit per regel doen i.p.v. de hele file zoals in mijn voorbeeld (zodat je steeds items 0,1,2 in het array krijgt), of je moet de hele array aflopen, waarbij bv. ${array[30]} het eerste item van regel 11 bevat.

Per regel kan dus zo:

code:
1
2
3
4
5
6
#!/bin/sh

while read line; do
  array=(`echo $line | awk '{print $1,$2,$3}'`)
  # ..Doe iets met ${array[0], [1], [2] etc.
done



Wat Flupzor doet is zo te zien nog makkelijker, alleen moet je dan de items nog wel 'met de hand' in het array zetten.

[ Voor 8% gewijzigd door Wilke op 19-05-2006 09:52 ]


Acties:
  • 0 Henk 'm!

  • DumbAss
  • Registratie: April 2002
  • Laatst online: 16-08 11:30
Bedankt voor de reacties. Hiermee kan ik zeker uit de voeten. Maar voor het leereffect:
als ik nu in de variabele i dit heb staan: "domein.nl user pass".

Hoe kan ik daar dan doorheen lopen? Dus het liefst op dezelfde manier als Flupzor.

EDIT
Gewoon via dit dus:
code:
1
2
array=(`echo $i | awk '{print $1,$2,$3}'`);
echo $array;

Op wat split awk eigenlijk? Op alles ofzo?

[ Voor 26% gewijzigd door DumbAss op 19-05-2006 11:12 ]

Vanutsteen.nl => nerds only | iRacing


Acties:
  • 0 Henk 'm!

  • DeMoN
  • Registratie: Maart 2001
  • Laatst online: 04-09 12:38

DeMoN

Pastafari

DumbAss schreef op vrijdag 19 mei 2006 @ 11:01:

Hoe kan ik daar dan doorheen lopen? Dus het liefst op dezelfde manier als Flupzor.
Hoe bedoel je nou precies? Want opzich staat het antwoord er al? :)

Maar goed, je kan (als het echt TABS zijn) bijv. met 'cut' door de lijst heenlopen. Wilke doet dit met 'awk' zoals je kunt zien.

Voorbeeld:

code:
1
2
3
4
5
6
7
8
9
10
debian:~# cat loopdoor
server.domein.nl        user    wachtwoord
server2.domein.nl       user2   wachtwoord2
server3.domein.nl       user3   wachtwoord3
server4.domein.nl       user4   wachtwoord4
debian:~# cat loopdoor |cut -f2-3
user    wachtwoord
user2   wachtwoord2
user3   wachtwoord3
user4   wachtwoord4

Dus dan pak je kolom 2 en 3 :)

[ Voor 3% gewijzigd door DeMoN op 19-05-2006 11:17 ]

Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein


Acties:
  • 0 Henk 'm!

  • DumbAss
  • Registratie: April 2002
  • Laatst online: 16-08 11:30
Hee bedankt. Cut is ook handig :)

Hoe zit het nu met die arrays? Want als ik dit doe:
code:
1
echo ${array[@]};

Krijg ik wel ouput te zien
Maar met deze code:
code:
1
echo ${array[1]};

Krijg ik niks te zien :?

Vanutsteen.nl => nerds only | iRacing


Acties:
  • 0 Henk 'm!

  • DumbAss
  • Registratie: April 2002
  • Laatst online: 16-08 11:30
Hebbes! Ik had IFS op \n staan.

Vanutsteen.nl => nerds only | iRacing


Acties:
  • 0 Henk 'm!

  • Wilke
  • Registratie: December 2000
  • Laatst online: 16:52
DumbAss schreef op vrijdag 19 mei 2006 @ 11:01:
Op wat split awk eigenlijk? Op alles ofzo?
Alle whitespace.

Acties:
  • 0 Henk 'm!

Verwijderd

Correctie, awk split op hetgeen gespecificeerd is in de $FS variabele ;)

Acties:
  • 0 Henk 'm!

  • DumbAss
  • Registratie: April 2002
  • Laatst online: 16-08 11:30
Ik heb ook nog dit commando:
code:
1
mysqldump --user=$user --password=$pass $db | gzip -9 > ~/$db.`date +%Y%m%d`.gz;

Hoe krijg ik de output van dit commando in een variabele? Dus de gewone stdout en stderr.
Ik kan het wel naar een bestand schrijven en dan opnieuw uitlezen, maar dat is een beetje omslachtig natuurlijk.
Zo wordt stderr naar stdout geschreven. Maar dan staat er nog steeds niks in message?
code:
1
 message=`mysqldump --user=$user --password=$pass $db 2>&1`

[ Voor 21% gewijzigd door DumbAss op 19-05-2006 13:55 ]

Vanutsteen.nl => nerds only | iRacing

Pagina: 1