mercoledì 1 agosto 2012

Te Lo Cerco

Scripta Manent II


Non so se vi è mai capitato di avere sul disco un paio di gigabytes di documenti in PDF riguardanti un argomento generico e dover cercare in quale di questi documenti, c'è esattamente l'informazione che state cercando.

Se non vi è mai capitato probabilmente state ricevendo questa trasmissione su un altro pianeta abitabile, fatto che la rende fuori luogo oltre che obsoleta o non lavorate nel campo dell'informatica.

Lascio a voi scegliere l'eventualità più remota.

Tralasciando quella simpatica canaglia, del cagnolino di XP che perde più tempo a scodinzolare che a cercare il documento testuale, se volete far le cose per bene e avete da qualche parte una Bash potete andare nella cartella dove avete i documenti e scrivere :

( for i in *.pdf; do zit=`pdftotext "$i" - | grep -i "parola"`; if [ ! -z "$zit" ]; then echo $i; fi ; done ) 2>/dev/null

Questa riga, elencherà tutti i documenti PDF dove è presente la parola, che avete scritto, poi li potete aprire e cercare espressamente.

Come funziona ? Beh, il 2>/dev/null e le parentesi tonde, servono solo a evitare di visualizzare gli eventuali errori, la riga tra parentesi invece esegue un ciclo tra tutti i documenti li converte al volo in formato testo con pdftotext filtrando l'output sul grep -i (ignore case),  verifica se il risultato è una stringa non vuota, se non lo è vuol dire che è presente il testo, quindi scrive il nome del file.

Poi, come ciliegina sulla torta, vi ricordo che il grep accetta le espressioni regolari e dicendo questo, ho detto tutto.
 

Pingolo

Scripta Manent I

 

Nota

Con questa nota, inizia una serie da 1 a N  di mini-post casuali, in cui realizzerò alcune acrobazie più o meno complesse, sulla linea di comando Linux Bash.

Lo scopo di tali post non è di illustrare dettagliatamente come funziona la Bash, perché a tale proposito vi sono decine di migliaia di documenti in rete.

L'idea è invece quella di illustrare alcuni strumenti "emarginati" dal mondo moderno a causa della loro apparente complessità, in grado di assolvere a compiti complessi che altrimenti richiederebbero l'installazione di software aggiuntivo, magari costoso e dannoso e/o inutili processi in background.

Si ricordi che strumenti come la Bash, derivata dalla vecchia Bourne Shell del 1977, sono nati in tempi in cui i computer andavano a qualche Mhz, e avevano dischi a 78 giri con manovella e grammofono. 

Oggi per fare una ricerca sequenziale su un centinaio di megabytes di files si impiega molto meno che installare un programma inutile tre volte più voluminoso, sporcare inutilmente il sistema e aspettare 20 minuti alla partenza, tra licenza,  splash screen e messaggi intimidatori.


Pingolo

L'altra notte stavo cercando di trovare una macchina sperduta sulla mia rete locale, che ha un indirizzo di classe C.

Essendo un pezzetto di hardware senza servizi, con il solo indirizzo di rete, l'unica cosa che potevo fargli fare era rispondere al più universale dei messaggi (quando non è bloccato), cioè il PING.

Vi sono vari programmi che lo fanno ma io ho la solita Bash sul solito Linux non avevo voglia di cercare e allora ecco qui cosa ho scritto :

for i in {1..254}; do ( ( ping -c 1 192.168.1.$i | grep "64 bytes"  ) & ) done  | cat

E mi sono trovato in un secondo l'elenco delle macchine sulla mia rete, trovando il responsabile sull'indirizzo 240.

Ovviamente all'indirizzo 192.168.1.$i, dovete sostituire quello della vostra rete mettendo il $i dove si presume che la cifra cambi.

Attenti che questa righetta di codice apre 256 processi e li richiude quasi subito, ma ci fa ottenere quello che vogliamo.

Poi potete provare a rendere il tutto più modulare e trovare altre soluzioni ma come al solito è il pensiero che conta.