Novita' in Vista: la nuova gestione della memoria.
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
Ricerca con grep in linux
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
Comando di ricerca grep
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 |
|
||||||||||||||||||||||||||||||||||||||||||
|
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. 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. ls | grep -v HOWTO 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. 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 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.
|
||||||||||||||||||||||||||||||||||||||||||
Tratto da: http://www.pcinformatica.eu
Il nuovo Windows Vista
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$>




