Juin 202011
 

script permettant un affichage amélioré de : bdf

bdf affiche généralement sur 2 ligne une info concernant un point de montage si celui-ci dépasse 80 caractère, ce qui est souvent le cas.

ce script affiche chaque enregistrement sur une seule ligne, avec en sus, des infos comme le nombre d’inodes et le type de filesystème.

la version perl de ce script fonctionne très bien.
cependant, perl n’est pas présent sur tout les serveurs.

voici donc la version ksh.

Download : bdfa.sh

#!/bin/ksh
##----------------------------------------------------------------------------
# ATTENTION : Pour lecture plus clair tapez :tabstop=3 sous vi ou positionner
# ---------   "set tabstop=3" dans le fichier ".exrc"
## Script  : bdfa
## Version : 2.0.0
## Objet   : Formatage de la commande bdf.
## Auteur  : Cedrick GAILLARD
##----------------------------------------------------------------------------
# 1.0.0 27-oct-06 - Cedrick - Creation
# 1.0.1 19-mar-07 - Cedrick - Ajout du PATH
# 1.1.0 19-mar-07 - Cedrick - modification du script en profondeur
#                             pour une selection du/des chemin(s) plus vaste.
# 2.0.0 02-jul-08 - Cedrick - reecriture quasi complete avec apparition de:
#                              - taille affichees du Ko jusqu'au Yo
#                              - plus de doublon sur les FS nfs
#                              - amelioration syntaxique
# 2.0.1 30-jul-08 - Cedrick - modification du code pour corriger les problemes suivants:
#                              - bdfa ne remontait pas jusqu'a la racine lors de: bdfa /somedir
#                              - bdfa ne prenais pas bien en compte le repertoire "."
# 2.0.2 02-avr-09 - Cedrick - Utilisation de df pour localiser le point de montage.
# 2.1.0 13-aou-09 - Cedrick - le metrique (M,G,Y,Etc...) est sur un caractere maintenant.
#                           - ajout du total de tout les FS en fin de calcul
#                           - correction de l'anayse des chemins donnes en argument.
# 3.0.0 21-sep-09 - cedrick - reecriture complete.
#                           - beaucoup plus rapide.
#                           - affichage du total si plus d'un FS.
#                           - accepte tous les arguments de bdf.
#                             
#-----------------------------------------------------------------------------
##
## Ce script permet d'afficher la sortie d'un bdf sans chevauchement de ligne
## l'option -i de bdf est utilisee ce qui permet d'afficher des informations
## sur les inodes.
##

[ "$(uname -s)" != "HP-UX" ] && {
   echo "Erreur: script indisponible pour [ $(uname -s) ]."
   exit
}

# Initialisations
SUFFIXES="KMGTPEZY"
MAX_SUFF=${#SUFFIXES}

# On recupere la sortie du bdf et on met sur une ligne ce qui doit l'etre
BDF_OUTPUT=$(bdf -i $@ |tail +2 |sed -e '/^[^ ][^ ]*$/{
N
s/[ ]*\n[ ]*/ /
}')

# On recupere les types de FS presents mont�s sur le systeme
MNT_OUTPUT=$(awk '{if($3 ~ "^"autofs"$") {next} else {printf("%s %s\n",$1, $3)}}' /etc/mnttab)

#------------------------------------------------------------------------------#
# Fonction retournant les nombres convertis avec leur suffixe.
#
calc_number () {
	NUMBER=$1
	ITERATION=1
	while [ "$NUMBER" -gt "1023" ]
	do
		[ "$ITERATION" -ge "$MAX_SUFF" ] && break
		ITERATION=$(($ITERATION + 1))
		NUMBER=$(echo "scale=2; $NUMBER / 1024" |bc)
	done

	NUMBER=$(printf "%.2f" $NUMBER)
	[ -n "$(echo "$NUMBER" |fgrep ".00")" ] && {
		NUMBER=$(printf "%.0f" $NUMBER)
	}
	echo "${NUMBER}$(echo $SUFFIXES |cut -c${ITERATION})"
}
#
# Fin - calc_number
#------------------------------------------------------------------------------#


#------------------------------------------------------------------------------#
# affiche le resultat
#
printf_data () {
	if [ "${#}" -gt "4" ]
		then
			printf "%-${LENGTH_LV}s %8s %8s %8s %5s %8s %8s %5s %5s %s\n" "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}"
		else
			printf "%${LENGTH_LV}s %8s %8s %8s\n" $1 $2 $3 $4
	fi
}
#
# Fin - printf_data
#------------------------------------------------------------------------------#

# On compte le nombre de caracteres du premier champ avec awk
LENGTH_LV=$(echo "${BDF_OUTPUT}" |awk 'BEGIN{name=0} {
	if(length($1) > name) {
		name=length($1)
	}
} END {
	print name
}')

# Affichage de l'En-tete
printf_data 'File System' Size Used Avail '%Used' Inodes Ifree '%IUsed' Type '%Mounted On'

TSIZE=0 TUSED=0 TAVAIL=0
# On met en forme
echo "${BDF_OUTPUT}" |while read LVOL SIZE USED AVAIL PUSED IUSED IFREE IUSE MOUNTED
do
	TSIZE=$(($TSIZE + $SIZE))
	TUSED=$(($TUSED + $USED))
	TAVAIL=$(($TAVAIL + $AVAIL))

	SIZE=$(calc_number $SIZE)
	USED=$(calc_number $USED)
	AVAIL=$(calc_number $AVAIL)

	# Type de FS
	FS_TYPE=$(echo "$MNT_OUTPUT" |grep "^$LVOL " |cut -d" " -f2)
	printf_data $LVOL $SIZE $USED $AVAIL $PUSED $IUSED $IFREE $IUSE $FS_TYPE $MOUNTED
done

# Affichage du total si plusieurs FS affiches
[ "$(echo "${BDF_OUTPUT}" |wc -l)" -gt "1" ] && {
	TSIZE=$(calc_number $TSIZE)
	TUSED=$(calc_number $TUSED)
	TAVAIL=$(calc_number $TAVAIL)
	printf_data -------- -------- -------- --------
	printf_data "Total:" $TSIZE $TUSED $TAVAIL
}
 Publié par à 12 h 47 min  Taggué avec :
Juin 102011
 

bdf amélioré sur une seule ligne:

  • affiche sur une seule ligne chaque FS
  • affiche le type de FS
  • affiche les Inodes
  • convertit les tailles dans un format humainement lisible
  • affiche un total de l’espace présent/utilisé/disponible en fin
Download : bdf.pl

#!/usr/bin/perl -w
#
# vim:tabstop=3:syntax=perl:
#
# ---------
## Script  : bdf.pl
## Version : 2.0
## Objet   : bdf ameliore
##----------------------------------------------------------------------------
# 0.1 27-aou-09 - Creation Cedrick Gaillard
# 2.0 31-aou-09 - Optimisation du temps d'execution
#               - Prise en compte des arguments de bdf
#               - n'affiche plus le total s'il n'y a qu'une ligne
#               - n'affiche plus l'entete si pas de FS a afficher.
#-----------------------------------------------------------------------------
#
# ce script remet en forme l'output de bdf:
#   - les tailles sont humainement lisible
#   - afiche en colonne claires et espacees
#   - affiche l'utilisation des inodes
#   - affiche le total de l'espace existant/utilise/disponible
#   - prend en compte tous les arguments de bdf ( -t nfs | -l | -s ...)
#-----------------------------------------------------------------------------

use strict ;
use warnings ;
use Time::HiRes qw( gettimeofday tv_interval) ;

# Initialisations
my (@suff) = qw(K M G T P E Z Y);
my $max_iterations = $#suff;

# On recupere la sortie du bdf
open (BDF,"bdf -i @ARGV |") or die "bdf: $!\n" ;

# On recupere les types de FS presents mont�s sur le systeme
open(MNTTAB,"</etc/mnttab") or die "/etc/mnttab: $!\n" ;
my @mnt_brut = <MNTTAB> ;
my (%fs_type) ;
foreach my $mnt_line (@mnt_brut) {
	my @mnt_line = split(' ',$mnt_line) ;
	next if( $mnt_line[2] =~ m/autofs/ ) ;
	$fs_type{$mnt_line[0]} = ( $mnt_line[2] ) ;
}
close( MNTTAB );

# Fonction retournant les nombres convertis avec leur suffixe.
sub calc_number {
	my ($number) = @_;
	my $iteration = 0;
	while ( $number > 1023 ) {
		last if ($iteration >= $max_iterations);
		$iteration++ ;
		$number = ($number / 1024);
	}
	$number = sprintf("%.2f",$number) ;
	if( $number =~ m/\.00/ ){
		$number = sprintf("%d",$number) ;
	}
	$number = sprintf("%s%s",$number, $suff[$iteration]) ;
	return ($number) ;
}

# generation d'un tableau, sort un pointeur vers ce tableau
sub generateur_ref_tab {
	my @t = () ;
	return \@t ;
}

# pour la premiere ligne
my @entte = (
	'File System',
	'Size',
	'Used',
	'Avail',
	'%Used',
	'Inodes',
	'IFree',
	'%IUsed',
	'Mounted on',
	'Type'
) ;

my $index = 1 ;
my $seconde_passe = 0 ;
my $length = 10 ;
my ($bdf_line, $nb_elem, $ref_bdf, @bdf_temp_1, @bdf_one_line) ;
my ($ttotal, $utotal, $atotal) = 0 ;

# Le premier enregistrement contenant le header
($bdf_one_line[0]) = (\@entte) ;

foreach $bdf_line (<BDF>) {
	next if( $bdf_line =~ m/^Filesystem/ ) ;
	chomp $bdf_line ;

	if( $seconde_passe == 0 ){
		@bdf_temp_1  = split(' ',$bdf_line) ;
		$ref_bdf = generateur_ref_tab() ;
	}
	else {
		$seconde_passe = 0 ;
		my $bdf_temp = join(' ', @bdf_temp_1, $bdf_line) ;
		@bdf_temp_1  = split(' ',$bdf_temp) ;
	}

	($nb_elem) = $#bdf_temp_1 ;
	if( $nb_elem <= 1 ) {
		$seconde_passe = 1 ;
		next ;
	}

	# Calcul de la taille la plus grande
	if( length($bdf_temp_1&#91;0&#93;) > $length ) {
		$length = length($bdf_temp_1[0]) ;
	}

	# Total des valeurs
	$ttotal += $bdf_temp_1[1] ;
	$utotal += $bdf_temp_1[2] ;
	$atotal += $bdf_temp_1[3] ;

	# Valeurs calculees
	$bdf_temp_1[1] = calc_number($bdf_temp_1[1]) ;
	$bdf_temp_1[2] = calc_number($bdf_temp_1[2]) ;
	$bdf_temp_1[3] = calc_number($bdf_temp_1[3]) ;

	# On rajoute un champ pour garder l'ordre
	$bdf_temp_1[9] = $bdf_temp_1[8] ;

	# Type de FS
	$bdf_temp_1[8] = $fs_type{$bdf_temp_1[0]} ;

	# On place toute la ligne dans le tableau reference
	(@$ref_bdf) = (@bdf_temp_1) ;
	($bdf_one_line[$index]) = ($ref_bdf) ;

	# On incremente
	$index++ ;
}

if ( $index <= 1 ) {
	print "Pas de FileSysteme a afficher\n" ;
	exit(0) ;
}

#Format
my $lengthFS = $length ;
my $lengthNB = 8 ;

$index = 0 ;

my ($t, $tk, $u, $uk, $a, $ak) ;
my ($fs, $pu, $iu, $if, $pi, $mo, $ty) ;
foreach (@bdf_one_line) {
	$fs = $bdf_one_line&#91;$index&#93;&#91;0&#93; ;
	$t  = $bdf_one_line&#91;$index&#93;&#91;1&#93; ;
	$u  = $bdf_one_line&#91;$index&#93;&#91;2&#93; ;
	$a  = $bdf_one_line&#91;$index&#93;&#91;3&#93; ;
	$pu = $bdf_one_line&#91;$index&#93;&#91;4&#93; ;
	$iu = $bdf_one_line&#91;$index&#93;&#91;5&#93; ;
	$if = $bdf_one_line&#91;$index&#93;&#91;6&#93; ;
	$pi = $bdf_one_line&#91;$index&#93;&#91;7&#93; ;
	$ty = $bdf_one_line&#91;$index&#93;&#91;8&#93; ;
	$mo = $bdf_one_line&#91;$index&#93;&#91;9&#93; ;

	printf( "%-${lengthFS}s %${lengthNB}s %${lengthNB}s %${lengthNB}s %5s %${lengthNB}s %${lengthNB}s %6s %4s %-${lengthNB}s\n",$fs, $t, $u, $a, $pu, $iu, $if, $pi, $ty, $mo) ;
	$index++ ;
}

# On affiche pas le total s'il n'y a qu'une ligne
if ( $index > 2 ) {
	($ttotal) = calc_number($ttotal) ;
	($utotal) = calc_number($utotal) ;
	($atotal) = calc_number($atotal) ;
	printf( "%${lengthFS}s %${lengthNB}s %${lengthNB}s %${lengthNB}s\n","Total:", $ttotal, $utotal, $atotal);
}

exemple de sortie :

$ bdf.pl
File System         Size     Used    Avail %Used   Inodes    IFree %IUsed Type Mounted on
/dev/vg00/lvol3    1.97G  314.57M    1.65G   16%     2581    54443     5% vxfs /
/dev/vg00/lvol1    1024M  147.29M  869.96M   14%      144    28048     1% vxfs /stand
/dev/vg00/lvol8       6G    3.44G    2.54G   58%    42861    83763    34% vxfs /var
/dev/vg00/lvol7       4G    3.25G  761.31M   81%    56491    24533    70% vxfs /usr
/dev/vg00/lvol6    7.81G    3.09G    4.69G   40%    55047   154809    26% vxfs /opt
/dev/vg00/lvol5       2G   16.38M    1.97G    1%       12    64980     0% vxfs /tmp
/dev/vg00/lvol4       2G   16.29M    1.97G    1%        4    64988     0% vxfs /data
         Total:   24.78G   10.26G   14.40G
 Publié par à 12 h 50 min  Taggué avec :