Newsgroup: it.comp.os.linux.development
Titolo: Scriptino bash...

Sempre io.
Ma come diavolo si passano i parametri a un programma awk, all'interno 
di uno script bash ?
Mi spiego...
Dovrei fare questo:
#!bin/bash
LIST=$(ls -l | awk '$1~/^-/ && $9~/\..*$/ {print $9}' | sed 's/.*\.//' | 
sort | uniq)
GRP=$(ls -l | awk '{print $4}' | sort | uniq)
for EXT in $LIST
do
     for G in $GRP
     do
         CNT=$(ls -l | awk '$1~/^-/ && $4~/ARGV[1]/ && $8~/\.ARGV[2]$/ 
{print $9}' $G $EXT | sort | wc -w)
         echo -e "\n .$EXT: $G $CNT"
     done
done
exit 0
ma mi dice che awk non riesce ad aprire il file in lettura... ma quale 
file ?? non sono file :)
Cioè argv[1] e argv[2] devono essere rispettivamente $G e $EXT.
Ho provato anche con apici, singoli, doppi, etc etc ma non va... ufffffff
Come faccio ?

 di uno script bash ?
Mi rispondo da solo:
bisogna assegnarli ad una variabile di awk e poi impostarli a null, così:
BEGIN {temp1=ARGV[1];ARGV[1]=""; etc...}
perché altrimenti awk tratta gli argomenti come nomi di file.
Ecco perchè mi diceva "impossibile aprire il file in lettura"... :)

 GRP=$(ls -l | awk '{print $4}' | sort | uniq)
il problema vedo che lo hai gia' risolto.
Aggiungo una cosa:
perche anziche' usare ls -l | awk ... per estrarre simili info non usi
il comando stat? Non so' quanto sia standard, forse non e' POSIX, ma
non ho ancora visto una distribuzione Linux senza. E' molto piu' veloce
e preciso. Ammette la formattazione dell' output per aiutare l' uso in
pipe.
es:
stat -c '%g %G' nomefile.txt
da il gruppo in numero e in nome con uno spazio un mezzo.
stat -c 'Nome:%n Access(ottale):%a Access(UGO):%A UserID:%u User(Name):%U'
nomefile.txt
stat -c 'Inode:% Ultima modifica:%y' nomefile.txt
tutto su
man 1 stat
Effettivamente se vuoi produrre complessi script con portabilita' POSIX
devi prima avere lo scrupolo di verificarne la conformita', ma credo non
sia POSIX.
Ciao.
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 pipe.
Si, conosco stat, ma posso usare soltanto alcuni strumenti indicati 
espressamente per risolvere questi problemini, e stat non c'č.
Cmq, approfitto...
Per ogni estensione di file della dir corrente, devo stampare il gruppo 
utenti che ha almeno un file con quella estensione con affianco il 
numero di file.
Es:
.txt: users 4
.pdf: staff 6
etc.
Ho provato a fare cosě:
#!bin/bash
LIST=$(ls -l | awk '$1~/^-/ && $9~/\..*$/ {print $9}' | sed 's/.*\./\./' 
| sort | uniq)
GRP=$(ls -l | awk '{print $4}' | sort | uniq)
for EXT in $LIST
do
     for G in $GRP
     do
         CNT=$(ls -l | awk -v gruppo="$G" -v estensione="$EXT" '$1~/^-/ 
&& $4~gruppo && $9~/\estensione$/ {print $9}' | sort | wc -w)
         echo -e "\n $EXT: $G $CNT"
     done
done
exit 0
ma in pratica $CNT č sempre zero :(
Credo che il problema stia in $9~/\estensione$/ ...
ma come faccio a dirglielo correttamente ad awk ?

 ma come faccio a dirglielo correttamente ad awk ?
Ragazzi aiutatemi, vi prego č importante...

 ma in pratica $CNT è sempre zero :(
Prima tutto dovrebbe essere $8 e non $9. 
Eppoi quando usi una variabile dovresti togliere gli slash (in pratica $x 
~/regexp/ diventa $x ~ var).
Prova con:
CNT=$(ls -l | awk -v gruppo="$G" -v estensione="$EXT" '$1~/^-/ && $4 ~ 
gruppo && $8 ~ "\\"estensione"$" {print $8}' |wc -l)
BTW, l'intero script potrebbe essere riassunto in una "riga" di awk :)
-- 
no signature yet

 BTW, l'intero script potrebbe essere riassunto in una "riga" di awk :)
Eeee... me lo faresti vedere ? :)

 Eeee... me lo faresti vedere ? :)
E' una riga per modo di dire:
$ ls -l | awk '
	$1 ~ /^-/{ 
		n = split($NF,tmp,"\\.");
		if (n>1) {
			V[tmp[n],$4]++}
		} 
	END{ for (el in V) {
		split(el,tmp2,SUBSEP);
		printf("%s\t%s\t%s\n",tmp2[1],tmp2[2],V[el])
	     }
	}'
Non l'ho testato più di tanto quindi occhio ai casi strani (filename con 
spazi per esempio).
Traendo spunto da un messaggio comparso oggi su comp.unix.shell (message-
id: g2ugs6$78f$
1...@aioe.org
) si potrebbe pure arrivare a scrivere:
$ ls -l | awk '$1~/^-/{n=split($NF,tmp,"\\.");if (n>1) {print tmp[n],
$4}}' | sort | uniq -c
-- 
no signature yet

 $4}}' | sort | uniq -c
Sbalordisco..... :)  (l'emoticons per lo sbalordimento non c'è)