PDA

Visualizza la versione completa : Formattazione output in bash


Kamui
24-12-2004, 11:21
Hola, dovrei fare uno script in cui presento l'output all'utente suddiviso per colonne... tipo tabella. Come l'output di "dpkg -l" per intenderci, in cui ogni campo/parola inizia a un punto preciso della riga.
Non ho trovato nulla sulle varie guide, forse perchè non so con quali keyword cercare... :bhò:
Cosa posso usare?
Inoltre, perchè il carattere speciale di tabulazione orizzontale (\t) non mi funziona? :dottò: e tutti gli altri sì, compresa la tabulazione verticale.

:ciauz:

Ikitt
24-12-2004, 11:38
Originariamente inviato da Kamui
[...]Cosa posso usare?
printf! Ma non la funzione C, l'omonimo comando (peraltro builtin in bash recenti)


Inoltre, perchè il carattere speciale di tabulazione orizzontale (\t) non mi funziona?
Con echo? Hai usato echo -e?
Ma poi che vuol dire "non funziona"?

Kamui
24-12-2004, 12:25
La pagina man di printf è pari solo a quella di grub... :dottò:
Cos'ha in più rispetto a echo -e?

Neanche con printf mi funzionano i tab:


root(/home/sly) #printf "cane\ngatto\n"
cane
gatto
root(/home/sly) #printf "cane\tgatto\n"
canegatto

La versione di bash che ho è "3.00.16(1)-release"
grazie :ciauz:

Ikitt
24-12-2004, 12:40
Originariamente inviato da Kamui
La pagina man di printf è pari solo a quella di grub... :dottò:
Cos'ha in più rispetto a echo -e?
Ah un monte di cose: conversioni di formato, specificatori di lunghezza dei campi...



Neanche con printf mi funzionano i tab:


root(/home/sly) #printf "cane\ngatto\n"
cane
gatto
root(/home/sly) #printf "cane\tgatto\n"
canegatto

La versione di bash che ho è "3.00.16(1)-release"


Non so che dirti:


$ echo $BASH_VERSION
3.00.16(1)-release
$ printf "cane\tgatto\n"
cane gatto
$ printf "cane\ngatto\n"
cane
gatto
$ which printf
/usr/bin/printf
$ builtin printf "cane\tgatto\n"
cane gatto
$

Kamui
24-12-2004, 13:11
Il problema è di multi-aterm, con ogni altro terminale che ho funziona il \t, compreso aterm. Ho una versione vecchia (0.0.5) e forse l'hanno risolto nella versione attuale (0.2 e 0.2.1), più tardi da slackware vedo, visto che il repository che mi forniva multi-aterm, quello di mentors.debian.net, è down da tempo :madai!?:

Mi sapresti consigliare qualche doc sull'uso di printf? In particolare sugli specificatori di lunghezza dei campi; ho googlato un po' ma trovo solo esempi banali :rollo:

Ilmalcom
24-12-2004, 13:12
Originariamente inviato da Kamui
Mi sapresti consigliare qualche doc sull'uso di printf? In particolare sugli specificatori di lunghezza dei campi; ho googlato un po' ma trovo solo esempi banali :rollo:
http://programmazione.html.it/c/c_17.htm

Kamui
24-12-2004, 13:21
Originariamente inviato da Ilmalcom
http://programmazione.html.it/c/c_17.htm
Ma quello è C... :dottò: cosa faccio, uso setw e setiosflags? :madai!?: :fagiano:

Ikitt
24-12-2004, 13:36
Originariamente inviato da Kamui
Ma quello è C... :dottò:
Gli argomenti di printf sono esattamente gli stessi...
esempiazzi:


$ printf "'%10s'\n" lungherrima
'lungherrima'
$ printf "'%10s'\n" lunga
' lunga'
$ printf "'%10s'\n" l
' l'
$ printf "'%-10s'\n" lungherrima
'lungherrima'
$ printf "'%-10s'\n" lunga
'lunga '
$ printf "'%-10s'\n" l
'l '
$ printf "%3.7f\n" 1.23
1.2300000
$ printf "%3.7f\n" 1.23777711111112
1.2377771

Kamui
24-12-2004, 13:51
Grazie mille :)

Per chi volesse un esempio pratico, ecco uno script inutile:


#!/bin/sh

array_dei_file_nella_home=( `ls -1 $HOME` )
numero_di_file_nella_home=`ls -1 $HOME | wc --lines`
echo -e "\n Ecco i file presenti nella tua home directory \n"
for(( i=1; i<($numero_di_file_nella_home+1); ++i)); do
printf "%-30s" "$i. [ ${array_dei_file_nella_home[$i-1]} ]"
if [[ `expr $i % 3` = 0 ]]; then
echo -e "\n"
fi
done
echo

Ilmalcom
24-12-2004, 14:15
Originariamente inviato da Kamui
Ma quello è C... :dottò: cosa faccio, uso setw e setiosflags? :madai!?: :fagiano:
Ricordati che la bellezza di printf è che è praticamente uguale in ogni implementazione che io conosca :D

Loading