Ciao sono pcinformatica
Vedi il mio profilo


Marzo 2007

DLMM GVS
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Tag

Archivio

Nuovi post

Diffondi i contenuti

Aggiungi al mio Dada

Aggiungi al mio Dada

Condividi i contenuti

De.licio.us

Novita' in Vista: la nuova gestione della memoria.

di pcinformatica (31/03/2007 - 15:45)

Ciao a tutti e benvenuti alla nuova puntata delle “novita' in Windows Vista”. Oggi ci occupiamo della gestione della memoria in tutti i suoi risvolti. Iniziamo con le modalità denominate “Superfetch” e BCD.

Leggi tutto l'articolo su PC Informatica

Vota questo post

Ricerca con grep in linux

di pcinformatica (31/03/2007 - 15:43)

La ricerca con grep Cercare testo ed espressioni nei file con il più classico degli strumenti Unix.
Una delle regole di base nella progettazione originale di Unix era di mantenere tutti gli output il più possibile regolari, in maniera da permettere la loro lettura automatica e quindi un'efficiente concatenazione (piping) dei comandi.

Leggi tutto

Vota questo post

Comando di ricerca grep

di pcinformatica (31/03/2007 - 14:00)

Sebbene tutti i comandi possano leggere l'output di un altro programma, quelli dedicati all'analisi e all'elaborazione dei file di testo sono pensati specificamente a questo scopo; l'elenco di quelli più comuni è riportato nella Tabella 1. Il numero di asterischi indica il grado di complessità e di flessibilità. Nei prossimi numeri avremo occasione di parlare degli altri comandi; ci è parso opportuno iniziare con grep, in quanto gli altri comandi sono spesso utilizzati sul suo output. La nostra trattazione sarà estremamente pragmatica; ci rifaremo ad esempi tratti dall'utilizzo quotidiano di un sistema Linux in modalità di linea, limitando all'essenziale la parte teorica, per la quale si può utilizzare la pagina di manuale, completa ed esaustiva come sempre ma poco adatta come tutorial.


1 Grep sui file

Lo scopo di grep è la ricerca di stringhe o pattern all'interno di file. Il suo inserimento nella famiglia di comandi di manipolazione di testo è giustificata dal fatto che spesso si vuole applicare una certa manipolazione solo alle righe di un file che contengono una certa stringa, e quindi si crea una concatenazione in cui grep costituisce un anello intermedio. Per esempio, si possono contare le funzioni contenute in un programma Fortran con il comando grep -i function myprog.f | wc -l Il parametro -i istruisce grep a ignorare la distinzione tra maiuscole e minuscole, dal momento che la parola chiave function in Fortran può essere sia maiuscola che minuscola; il primo argomento è la stringa da cercare; il secondo è il file in cui effettuare la ricerca. L'output di grep viene dato "in pasto" a wc(1) (abbrevazione di word count) con il parametro -l per contarne le linee (e non anche i caratteri e le parole). Un utilizzo "alla cieca" di grep seguito da wc è in verità piuttosto raro; in genere si preferisce prima visualizzare le righe effettivamente trovate utilizzando less piuttosto che wc. In effetti, è possibile che la ricerca della stringa "function" cosí com’è trovi righe non interessanti, ad esempio commenti o identificativi non particolarmente brillanti come MYFUNCTION o FUNCTIONAL. In questo caso occorre restringere la ricerca, utilizzando pattern anziché semplici stringhe (vedi paragrafo successivo) e ritentare. Alla fine la concatenazione con wc potrebbe non servire affatto, dal momento che less effettua comunque un suo conteggio delle linee. Se però si stanno effettuando dei test per un comando da inserire in uno script, il risultato più interessante non è il numero in sé, ma il comando utilizzato per ottenerlo. Questo tipo di utilizzo di grep illustra bene la logica di progettazione di Unix di cui si parlava all'inizio. Senza una concatenazione semplice ed efficiente, operazioni concettualmente semplici come la precedente richiedono che ciascun comando sia dotato di una sequenza complessa di opzioni; con la concatenazione, molti comandi possono essere progettati in modo da effettuare una singola, semplice operazione, e con una complessità minima è possibile effettuare manipolazioni estremamente complesse. Oltre alla domanda "questa stringa è contenuta in questo file?", ci si può naturalmente chiedere "esiste un file contenente questa stringa?". La risposta a questa domanda si ottiene semplicemente aggiungendo ulteriori file in cui cercare, ad esempio, grep -i entry myprog.f yourprog.f hisprog.f herprog.f controlla se qualcuno dei file indicati contiene "entry points". Questo secondo esempio spiega cosa si intendeva all'inizio con "output regolare": la mancanza di intestazioni e linee conclusive, che fanno apparire il sistema apparentemente scarno, ma che rendono l'utilizzo di più file semplice come quello di un file singolo. Se grep aggiungesse delle linee di intestazione per ogni file, sarebbe impossibile effettuare conteggi di linee in maniera semplice e lineare; se ne aggiungesse una singola, si perderebbe tutto lo scopo dell'intestazione. La logica vincente, quindi, è che l'output dei comandi è ottimizzato per l'uso da parte di altri programmi, non da parte di esseri umani.

Tabella 1 • Comandi per l’analisi e l’elaborazione di file di testo.

** grep

pattern scanning

* sort ordinamento
* uniq rimozione di duplicati
* cut seleziona parti delle linee
* look cerca linee in un file ordinato
* rev inverte le linee
* wc conta caratteri e linee
* nl numera le linee
* head seleziona la parte iniziale di un file
* tail seleziona la parte finale di un file
* unbuffer disabilita il buffer di output di un comando
* tee redirigi su più file
*** awk pattern scanning and processing
*** sed effettua trasformazioni di testo

È possibile esprimere concetti come "tutti i file in questa directory" oppure "tutti i file di un certo tipo" utilizzando le capacità di pattern-matching della shell. L'asterisco '*' indica una stringa arbitraria, il punto interrogativo '?' un carattere arbitrario; e un'espressione del tipo "[...]" indica uno qualunque dei caratteri inseriti tra le parentesi quadre. Con le parentesi quadre si può utilizzare un intervallo di caratteri nella forma a-z, oppure indicare i caratteri diversi da quelli riportati facendo seguire alla parentesi quadra iniziale il carattere '^' (vedi Riquadro 2).

La sostituzione è effettuata dalla shell prima che il comando stesso venga eseguito. Così, il comando grep -i function *.f viene effettuato in tre fasi:

1. La shell utilizzata crea l'elenco dei file che soddisfano il pattern *.f, cioè il cui nome sia formato da una stringa arbitraria seguita dai due caratteri '.f';

2. La lista viene sostituita al posto del pattern sulla linea di comando;

3. La linea di comando viene eseguita.

La sostituzione viene eseguita per ogni parametro che contenga uno dei caratteri '*', '?' e '['. La Tabella 2 contiene ulteriori esempi di pattern con la relativa "traduzione" in lingua italiana; può sembrare difficile a credersi, ma con un minimo di abitudine il pattern risulta più chiaro della traduzione!
Alcuni esempi comuni di questo tipo di utilizzo di grep possono essere la ricerca “per argomento” all’interno degli HOWTO:

cd /usr/doc/HOWTO
grep -i network *HOWTO | less

la ricerca di un mail in cui si parla di un certo argomento,

cd ~/Mail ; grep Sandman *
o la ricerca del file in cui è contenuta l'implementazione di un certo protocollo:

cd ~/src/pine4.10/pine ; grep -i imap *.c

Tabella 2 • Esempi di “pattern matching” della shell

*~ nome che termina con il carattere '~' (i file di backup di emacs)
*.tar* nome che contiene la stringa ".tar" (comprende ad esempio *.tar e *.tar.gz)
c* nome che inizia con la lettera 'c'
*.? nome che termina con un punto e una singola lettera
*.??? il nome termina con esattamente tre lettere
*[0-9]* il nome contiene una cifra
*.[chf] indica i file di tipo .f, .h e .c
*[^a-zA-Z0-9] seleziona i file il cui nome termina con un carattere non alfanumerico




2 Pipe e regexp

L'uso di grep nelle pipe è anche più frequente di quello sui file, essendo appropriato ogni qual volta l'output di un comando sia particolarmente lungo. Uno degli utilizzi più frequenti su un sistema Red Hat, ad esempio, consiste nel cercare un certo package rpm (o una certa famiglia di package) già installato:

rpm -qa | grep gnome

Il comando rpm -qa produce l'elenco di tutti i package installati sul nostro sistema; questo elenco viene poi dato come input a grep, che selezionerà solo i nomi contenenti la stringa "gnome". Ovviamente in questo caso non si debbono dare ulteriori argomenti a grep, altrimenti la ricerca verrebbe effettuata sui file corrispondenti e lo standard input verrebbe ignorato.
Potrebbe sembrare che le capacità di pattern matching dello shell rendano inutile l'utilizzo di grep in concatenazione con ls; ma le caratteristiche aggiuntive di grep rendono anche questo tipo di utilizzo interessante. Consideriamo il seguente semplice esempio:

cd /usr/doc/HOWTO ; ls | grep -i net

Tra i file selezionati compariranno NET-3-HOWTO, Networking-Overview-HOWTO e Ethernet-HOWTO, in cui la stringa cercata è scritta in tre modi diversi; non c'è una maniera semplice di selezionare questi file con il pattern matching dello shell.
E a proposito della directory degli HOWTO, ci si può chiedere: contiene solo HOWTO, o anche altri file? A questa domanda risponde il comando

ls | grep -v HOWTO
Il parametro -v istruisce grep a mostrare le linee che non contengono la stringa o il pattern cercato.
Un ulteriore elemento di flessibilità di grep è la possibilità di cercare non solo stringhe, ma anche le cosiddette espressioni regolari (regexp). Una regexp è simile a un pattern, ma ha una sintassi molto più ricca e complessa (v. Riquadro 3). Di espressioni regolari si è già parlato su Linux Magazine dello scorso dicembre, in connessione all'interprete Perl; si tratta di un metodo molto flessibile per esprimere costrutti complessi. Le espressioni regolari trovano posto nella creazione di script o nella programmazione vera e propria, più che nell’utilizzo quotidiano di un sistema

Unix, ma una familiarità con la loro sintassi può tornare utile anche per risolvere problemi occasionali. Vediamo qualche esempio; il comando

grep conta *.tex

troverà non solo le linee contenenti la parola "conta", ma anche quelli contenenti parole come "raccontato", "contare" o "contatto". Per trovare solo la parola "conta" si utilizza invece il comando

grep "

Notiamo che nell'utilizzo con grep, come con molti altri comandi, è opportuno inserire le espressioni regolari tra apici (semplici o doppi) in modo che lo shell non tenti di interpretare i caratteri speciali praticamente sempre presenti.
Un altro semplice esempio consente di trovare una parola a inizio riga, con uno o più spazi intermedi:

grep "^ *class>" *.cc *.h

Il seguente esempio conta invece le linee vuote per ciascun file C++. Le linee vuote, naturalmente, sono costituite da un inizio linea immediatamente seguito da un fine linea:

grep --count "^$" *.cc
L’opzione --count ha un effetto leggermente diverso dalla concatenazione con wc, in quanto permette di avere un conteggio relativo a ciascun file.
Le espressioni con le parentesi graffe possono essere utilizzate per trovare tutte le parole più lunghe di un certo numero di caratteri:

grep '[[:alpha:]]{16,}' *.tex

Notiamo che, secondo le indicazioni della Tabella 3, le parentesi graffe vanno precedute da un backslash nell'utilizzo usuale di grep, che non usa espressioni regolari estese; questo comportamento può essere modificato con l'opzione -E, con la quale l'esempio precedente diviene

grep -E '[[:alpha:]]{16,}' *.tex

Un esempio appena più complesso indica come trovare le sequenze di tre caratteri identici ripetuti, che in italiano in genere indicano un errore di battitura:

grep -E '([[:alpha:]])11' *.tex

Notiamo l'uso delle parentesi tonde per poter in seguito far riferimento all'espressione trovata. Un'espressione analoga, la cui traduzione è lasciata come esercizio, è la seguente:

grep -E "(<[[:alpha:]]*>) 1 " *.tex

La sintassi delle espressioni regolari può inizialmente apparire un po' ostica, ma è difficile immaginare un metodo alternativo che ne conservi la potenza e l'espressività. Con un minimo di esperienza, si riescono a ottenere rapidamente risultati sbalorditivi.

. un singolo carattere qualsiasi
[...] uno qualunque dei caratteri nella lista
[^...] un qualunque carattere non in lista
[[:alpha:]]
[[:digit:]]
[[:alnum:]]
classi di caratteri predefinite, vedere la pagina di manuale per l'elenco completo
^ l'inizio della linea
$ la fine della linea
< l'inizio di una parola
> la fine di una parola
b il punto di separazione tra due parole
B un qualunque punto che non separa due parole
? zero o una ripetizione dell'elemento precedente
* zero o più ripetizioni dell'elemento precedente
+ una o più ripetizioni dell'elemento precedente
{n,m} un numero di ripetizioni dell'elemento precedente compreso tra n e m; uno dei due numeri può essere omesso per omettere il limite corrispondente.
| OR logico: una stringa deve soddisfare una delle due espressioni indicate
(..) raggruppa un'espressione
Tabella 3 • Sintassi delle espressiono regolari.


3 Conclusioni
Grep costituisce uno strumento di base per la manipolazione dei file di testo e per la concatenazione di comandi, due dei punti di forza di Unix; esso consente anche di sperimentare la potente sintassi delle espressioni regolari. Il lettore interessato è incoraggiato a utilizzare la propria inventiva per acquistare una maggiore familiarità con la loro sintassi, che costituisce un elemento importante dell'ambiente Unix in generale e Linux in particolare. fonte: ITportal

Tratto da: http://www.pcinformatica.eu

Vota questo post

Il nuovo Windows Vista

di pcinformatica (30/03/2007 - 21:26)

Ciao a tutti,

vorrei sapere la vostra opinione sul nuovo sistema operativo di casa Microsoft, pensate che valga la pena lasciare il vecchio ma abbastanza affidabile xp per passare al nuovo arrivato?

<$BlogInclude:adsense336_b$>

Vota questo post