[Linux] - awk , df output omzetten naar csv (woord probleem)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • GC-Martijn
  • Registratie: September 2004
  • Laatst online: 09-12-2018
een normaal df command geeft deze output:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 20161204 4556580 14580484 24% /
/dev/sda1 248895 103138 132907 44% /boot
none 517304 0 517304 0% /dev/shm
/dev/sda5 9675828 5540516 3643728 61% /vol


Dit wil ik om zetten naar 'csv' (; seperator)

Wat ik tot nu toe heb is het volgende:

df -h |awk 'BEGIN { OFS=";"; ORS="\n"}{print $1,$2,$3,$4,$5,$6}'

Filesystem;Size;Used;Avail;Use%;Mounted
/dev/sda3;20G;4.4G;14G;24%;/
/dev/sda1;244M;101M;130M;44%;/boot
none;506M;0;506M;0%;/dev/shm
/dev/sda5;9.3G;5.3G;3.5G;61%;/vol

Dan zit de fout in het woord Mounted , dit moet eigenlijk zijn: Mounted on

Wanneer ik weet hoe ik met dit soort woord problemen om moet gaan kan ik dit voortaan gebruiken voor andere zaken.

How to fix ?

// - bla la


Acties:
  • 0 Henk 'm!

  • MrJay
  • Registratie: Juni 2004
  • Laatst online: 24-10-2024
Een quick-fix:

df -h |awk 'BEGIN { OFS=";"; ORS="\n"}{print $1,$2,$3,$4,$5,$6" "$7}'


Een andere manier zou kunnen zijn om met een andere tool te splitsen op spaties en het maximum aantal splitsingen in te stellen op 5. Daar kan ik je niet zo plots een voorbeeld van geven.

Een echt algemene oplossing is er denk ik niet, dit zal je dus probleem per probleem moeten fixen.

Acties:
  • 0 Henk 'm!

  • GC-Martijn
  • Registratie: September 2004
  • Laatst online: 09-12-2018
Bedankt voor het duidelijke voorbeeld.

Ik zat ook te denken of het misschien mogelijk is om de uitvoer aan te passen, dat wil zeggen

replace "Mounted on" naar "Mounted_on" | awk 'BEGIN { OFS=";"; ORS="\n"}{print $1,$2,$3,$4,$5,$6}'

maar dit is duidelijk korter:
df -h |awk 'BEGIN { OFS=";"; ORS="\n"}{print $1,$2,$3,$4,$5,$6" "$7}'

// - bla la


Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 11-09 21:28

CAPSLOCK2000

zie teletekst pagina 888

GC-Martijn schreef op vrijdag 11 september 2009 @ 15:49:
Bedankt voor het duidelijke voorbeeld.

Ik zat ook te denken of het misschien mogelijk is om de uitvoer aan te passen, dat wil zeggen

replace "Mounted on" naar "Mounted_on" | awk 'BEGIN { OFS=";"; ORS="\n"}{print $1,$2,$3,$4,$5,$6}'

maar dit is duidelijk korter:
df -h |awk 'BEGIN { OFS=";"; ORS="\n"}{print $1,$2,$3,$4,$5,$6" "$7}'
Natuurlijk kan het, maar het is altijd een beetje balanceren tussen gemak en flexibiliteit.
Wat ook een oplossing _zou_ kunnen zijn, is om de eerste regel er af te knippen, en/of te vervangen door een vaste eerste regel. Als het toch altijd hetzelfde is, waarom dan moeilijk doen met vervangen he :)


Ik ga er vanuit dat dit een beetje spielerei is, maar mocht je het serieus willen gebruiken, dan heb ik nog wat tips:
1. -h : Als je nog iets anders met deze gegevens wil doen dan ze laten zien kun je beter geen df -h gebruiken. Anders kun je het vervelende bijeffecten krijgen, bijvoorbeeld als je een vergelijking wil maken tussen 1000MB, 1G, 2G?
2 -P : posix compatibility, met -P gedraagd df zich meer zoals het zich ook op andere unix systemen zou gedragen, en is beter geschikt voor scripts. Vergelijk:
code:
1
2
3
4
5
$ df
/dev/sda1            157566568 143542416  14024152  92% /home/casper/data/video
/dev/mapper/vg_dump2-dump
                      67389424  63419544   3969880  95% /home/casper/data/dump
rum:/exports/data     62986240  57740608   5245632  92% /mnt/rum/data


code:
1
2
3
4
$ df -P
/dev/sda1            157566568 143542416  14024152      92% /home/casper/data/video
/dev/mapper/vg_dump2-dump  67389424  63419544   3969880      95% /home/casper/data/dump
rum:/exports/data     62986240  57740608   5245632      92% /mnt/rum/data


Let met name op de extra regel. Het ziet er misschien minder mooi uit, maar is wel veel geschikter voor scripten.

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

Verwijderd

Een betere manier is misschien om gewoon alle spaties te vervangen door ; en dan terug veranderen
$ df -h | awk '{gsub(/ +/,";");sub(/;on/," on");print}'
Filesystem;Size;Used;Avail;Use%;Mounted on
/dev/root;15G;6.7G;7.3G;49%;/
/dev/sda2;43G;14G;28G;34%;/home
tmpfs;998M;8.0K;998M;1%;/dev/shm

andere mogelijkheid

df -h | awk '{for (i = 1; i <= 5; i++) sub(/ +/,";");print}'
Filesystem;Size;Used;Avail;Use%;Mounted on
/dev/root;15G;6.7G;7.3G;49%;/
/dev/sda2;43G;14G;28G;34%;/home
tmpfs;998M;8.0K;998M;1%;/dev/shm

[ Voor 34% gewijzigd door Verwijderd op 13-09-2009 14:33 ]


Acties:
  • 0 Henk 'm!

  • GC-Martijn
  • Registratie: September 2004
  • Laatst online: 09-12-2018
@CAPSLOCK2000
Bedankt voor de tip met -H is het inderdaad lastig om later te gebruiken.
-P was ik al achter gekomen :)

@whiz
Bedankt voor die uitleg, kan wel vaker van pas komen.
Ik ga ze direct testen.

// - bla la

Pagina: 1