Toon posts:

[bash-script] String concateneren met awk

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een scriptje wat de vrije schijfruimte in rrd-tool moet gaan zetten, maar het lukt niet helemaal. Ik heb nu het volgende:

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

DISKS="hda1 hda5 hdb1 hdd1"
UPDATESTRING=""

for i in $DISKS; do
    df | grep $i | awk '{ print ":"$4  }'
done

echo $UPDATESTRING


De bedoeling is dat met awk de UPDATESTRING steeds wordt aangevuld met een dubbele punt : gevolgd door de vrije schijfruimte van de disk. Met print krijg ik de juiste waardes te zien, maar zodra ik iets wil doen als

code:
1
    df | grep $i | awk '{ UPDATESTRING=$UPDATESTRING":"$4  }'


dan werkt het niet meer: of alleen lege regels als output, of syntax errors als ik haakjes of quotes eromheen probeer te zetten. Wie weet hoe je dat doet?

  • baziel
  • Registratie: Februari 2003
  • Laatst online: 26-01-2023
hoi , ik doe het met sed, misschien heb je er wat aan (suse 9.2, voor hp-ux heb ik 'm ook als het handig is):
code:
1
2
3
4
5
6
7
8
9
10
#! /bin/bash
df -k |
grep -v Filesystem |
sed s/"tmpfs"/"\/tmpfs"/ |
sed s/^[/[:alnum:]-]*[[:space:][:cntrl:]]*// |
grep -v "^$" |
sed s/[[:space:]][[:space:]]*/";"/g |
sed s/\%\;/\%\;\"/ |
sed s/$/\"\;/ |
sed s/\;[[:digit:]][[:digit:]]*\%\;/\;/


het kan wat korter, maar het werkt.
je hebt dan een ; delimited file wat je makkelijk in kan lezen.

uitkomst:

code:
1
2
3
4
5
6
server:/opt/oracle/oradba/osdiskfree  #  ./osdiskfree.sh
115345508;37405960;72080244;"/";
1038056;24;1038032;"/dev/shm";
46633;9816;34409;"/boot";
16468952;4335732;11296636;"/opt";
115345508;83121436;26364768;"/samba";

Baziel


Verwijderd

Topicstarter
Bedankt! Ik ga 's kijken of ik 't ook met sed op kan lossen.

Wat ik wil is alleen toch wel iets anders dan jij: ik wil een string met de schijfruimte van vier disks, gescheiden door dubbele punten. Dus bijv. :87263:23521:235:235:234562. Awk lijkt me hiervoor de logische keus, en ik snap maar niet waarom ik die string niet aan elkaar kan plakken?

  • baziel
  • Registratie: Februari 2003
  • Laatst online: 26-01-2023
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /bin/sh
df -k |
grep -e total -e free |
sed s/[[:cntrl:]]// |
sed s/[[:blank:]]// |
sed s/[[:space:]]// |
sed s/"^  *"//|
sed s/"total allocated Kb"/"totalkb"/|
sed s/"free allocated Kb"/freekb/|
sed s/"(.*) :"/"\";"/|
sed s/totalkb$/totalkb#/|
sed '/#/{N
s/#\n/ /
}'|
sed s/totalkb/";"/ |
sed s/freekb/";"/|
sed s/"^\/"/"\"\/"/|
sed s/"  *"/" "/g|
sed s/" "//g|
sed s/[[:cntrl:]]//g |
sed s/[[:blank:]]//g |
sed s/[[:space:]]//g

is mijn dingetje om het zelfde mee te doen op hp ux.
als je goed zoekt zie je de regel:
code:
1
2
3
sed '/#/{N
s/#\n/ /
}'|

dat stukje haalt de \n (is newline) weg, en joint dus 2 regels. maar da's weer met sed :+

Baziel


  • Oezie Woezie
  • Registratie: December 1999
  • Niet online

Oezie Woezie

Pim. is de beste

wat doen jullie allemaal moeilijk zeg, kan gewoon met dit stukje code:
code:
1
df | awk '{ printf ":"$4  }'


dat geeft bij mij deze output(en dat is denk ik wat je zoekt):
code:
1
2
 df | awk '{ printf ":"$4  }'
:Available:6512448:74562:257908:4686864

een mooi Tshirt met Pim. is de beste enzo


Verwijderd

Topicstarter
Thanks iedereen! Ik vond het toch wel handig om 't met een for-loop te doen omdat ik dan zelf de volgorde van de schijven en welke schijven worden meegenomen in de hand heb dus 't is nu het volgende geworden:

code:
1
2
3
4
5
6
7
DISKS="hda1 hda5 hdb1 hdd1"

for i in $DISKS; do
    UPDATESTRING=$UPDATESTRING`df | grep $i | awk '{ printf ":"$4 }'`
done

echo $UPDATESTRING
Pagina: 1