Visualizzazione post con etichetta Progetto Bash. Mostra tutti i post
Visualizzazione post con etichetta Progetto Bash. Mostra tutti i post

sabato 31 ottobre 2015

Eliminare i file di una directory contenenti una parola determinata.

Salve!

Supponiamo che in una directory, ad esempio in Documenti, abbia tantissimi file di testo e che voglia eliminare solo quelli che contengono, nel testo e non nel titolo, una determinata parola, come fare? Se si vuole evitare di cercare prima la parola in ciascuno di esso e poi eliminarli, si può usare uno script facile facile. ;)

#!/bin/bash

read -p "Quale parola vuoi cercare? " stringa
for file in $(grep -l $stringa *); do
    rm -i $file;
done
exit 0

Ovviamente lo script, prima di eliminare un qualsiasi file, chiede il consenso. Nel mio caso ho eliminato tutti i file nel cui testo compariva la parola Fedora. (non ho niente contro Fedora, eh, è solo un esempio) ;)


Alla prossima! 

mercoledì 28 ottobre 2015

Come tee nessuno!

Salve!

Oggi parliamo, ma solo per un esempio, del comando tee. Per approfondire vi invito ad andare sulla pagina di Wikipedia.

$ risultato=$(echo "Come tee nessuno"| tee  >(sed 's/ /_/g') >(sed  's/\(.*\)/\U\1/') >(rev))

$ echo "$risultato"

In questo caso l'output del comando "echo" viene passato contemporeaneamente, grazie a tee, a tre comandi diversi, che lo elaborano e ne restituiscono i rispettivi risultati:
1. Il primo sed aggiunge l'underscore.
2. Il secondo sed converte la frase da minuscolo in maiuscolo.
3. Il comando rev inverte i caratteri della frase.


Alla prossima.

Sequenza di numeri [bash]

Salve!

Espansione di parentesi graffe VS il comando Seq.

$ echo {1..5} | tr ' ' '\n'
$ seq 1 5

$ echo {1..5}
$ seq -s ' ' 1 5
dove -s sta per output separator.

$ echo {001..5}
$ seq -s " " 001 5

$ echo -e {0..5}"\xc2\xb0"
$ seq -w  0 5 | sed  's/$/\xc2\xb0/' | tr "\n" " "; echo
"\xc2\xb0" = simbolo del grado

Incremento positivo
$ echo {1..10..2}
$ seq -s " " 1 2 10

Incremento negativo
$ echo {10..1..2}
$ seq -s " " 10 -2 1


E poi...
$ echo {a..z}
$ echo {a..z..3}




E ancora
$ echo -e {Lubit,Linux}"\xc2\xae"
\xc2\xae = simbolo del marchio registrato.

Alla prossima!

mercoledì 30 settembre 2015

Manipolazione del testo all'interno delle parentesi graffe #Bash

Salve!

Ora che Lubit è stata rilasciata, di sicuro, salvo imprevisti, sarò più presente sul blog.

Assegno alla variabile "stringa" il titolo di uno dei più famosi film di Lina Wertmüller

stringa="Travolti da un insolito destino nell'azzurro mare d'agosto"

Ora voglio che in output le singole parole siano legate tra loro da underscore

echo ${stringa// /_}


Nei prossimi post continueremo a fare esempi sulle parentesi graffe. :)

Ciao!

P.S. Avete scaricato Lubit 6? Qui

mercoledì 14 gennaio 2015

Il Codice di Cesare [Brevi Esercizi]

Salve!

Uno degli esempi più significativi di crittografia a chiave simmetrica dell'età classica fu senza dubbio il cifrario di Cesare.

Come funziona codesto codice?

Si tratta di un cifrario a sostituzione monoalfabetica: Ogni lettera di una parola viene sostituita con un'altra in base ad una chiave.

Si dice che Cesare usasse come chiave K=3

Esempio:

Parola in chiaro: Luca
Parola cifrata: OAFD

Stabilito che la chiave è 3, la lettera L va sostituita con la lettera O, la lettera U con la lettera A, la lettera C va sostituita con la G e la lettera A con la lettera D.  Chiave 3 significa che bisogna contare tre posti in avanti nell'alfabeto (italiano, nell'esempio), a partire dalla lettera data, che va esclusa dal computo.

Ho creato uno script in bash, semplice semplice, che cifra e decifra in base al cifrario di Cesare. 

#!/bin/bash
#Cifrario di Cesare
#bit3lux@gmail.com

cifrare() {
#chiave=3
#Alfabeto di 26 lettere, senza spazi.
clear
alfabeto=$(echo {a..z} | sed 's/ //g')
k3="DEFGHIJKLMNOPQRSTUVWXYZABC"
read -p "digita il testo da cifrare: " testo
echo $testo | tr "[:upper:]" "[:lower:]" | tr "$alfabeto" "$k3"
}

decifrare() {
clear
alfabeto=$(echo {a..z} | sed 's/ //g') 
k3="DEFGHIJKLMNOPQRSTUVWXYZABC"
read -p "digita il testo da decifrare: " testo
echo $testo | tr "[:lower:]" "[:upper:]" | tr "$k3" "$alfabeto"
}

clear
echo "Per cifrare digita 0, per decifrare digita 1."
echo
read scelta

if [ $scelta == 0 ]
then
    cifrare
    echo

elif [ $scelta == 1 ]
then
    decifrare
    echo

else
    clear && echo "Opzione non valida, per scegliere digita 0 o 1"
    echo

fi

exit 0

Cifrare
Decifrare
Alla prossima!

venerdì 18 luglio 2014

Underscore [Brevi Esercizi]

Salve.

L'esercizio di oggi consiste nell'aggiungere l'underscore, "_", ai titoli di alcune canzoni riportati in un file di testo. 


Python

#!/usr/bin/python
# -*- coding: utf-8 -*-

var = open("brani_1.txt","w")
for line in open('brani.txt'):
    var.write(line.replace(' ','_'))
var.close()


Awk

cat brani.txt | awk '{ gsub(" ","_"); print; }' > brani_1.txt

Sed

cat brani.txt | sed 's/ /_/g' > brani_1.txt

Tr

cat brani.txt |  tr ' ' '_' > brani_1.txt

Bash

var=$(cat brani.txt); echo "${var// /_}" > brani_1.txt

Alla prossima!

L'indice della rubrica "Brevi Esercizi" lo trovate qui.

lunedì 7 luglio 2014

Una cosa sugli arrays [bash]

Si erano fatte le tre di notte e stavo seguendo un video in tedesco, fattomi pervenire per posta da un mio caro amico da Köln. Un corso di bash in tedesco, per intenderci. Tutto bene fino a quando il tale, che tra l'altro con il suo suono gutturale della voce mi ha stimolato i succhi gastrici, si è espresso in questi termini, più o meno:

definiamo un array:

$ valori=(1 2 3 4 5 6 7 8 9)

Ora, secondo lui, cioè il tale di cui sopra, se faccio

$ echo ${valori[*]}

$ echo ${valori[@]}

dovrei ottenere lo stesso risultato. Ed è proprio così. Ottengo tutti i valori dell'array. Ma non è questo il punto. Dai, questa cosa la sapevamo...

Mi sono detto, possibile che questi due caratteri, "@" e "*", non abbiano alcuna differenza in codesto ambito?

In realtà sì, una differenza l'ho scovata, forse. Magari ce ne sono pure altre.

$ for i in "${valori[*]}"; do echo " $i "; done #con i doppi apici

0 1 2 3 4 5 6

$ for i in ${valori[*]}; do echo " $i "; done #Senza doppi apici


 0
 1
 2
 3
 4
 5
 6

Mentre nel caso del carattere @,

$ for i in ${valori[@]}; do echo " $i "; done #senza doppi apici
$ for i in "${valori[@]}"; do echo " $i "; done #con i doppi apici

ottengo sempre, come risultato,

 0
 1
 2
 3
 4
 5
 6

Sicuramente i miei cari amici Ennio e Juhan ne sapranno di più.
 
Chi volesse approfondire gli arrays in bash, segnalo l'indice del progetto bash, qui.

martedì 6 agosto 2013

La directory speciale ~/bin

Una cosa che noi vecchi, quelli che "io vengo da Unix", mantra che so dire anche in inglese "I came from Unix" sanno è quella della directory speciale ~/bin.

Nel post precedente Bit3Lux propone di spostare lo script in /usr/local/bin, soluzione senz'altro valida. E una volta, diciamo 20-30 anni fa lo sarebbe stato ancora di più.
Ma oggi il computer che usate molto probabilmente lo usate solo voi. E molto probabilmente avete un solo user con cui vi logate; o, se siete davvero metodici, un solo user con cui lo script serve.

In questo caso la procedura può essere semplificata: invece di operare sulle directories della root possiamo stare all'interno di casa nostra, la nostra home.

Da terminale diamo il comando

cd

e vi troverete nella vostra home. Potete anche usare cd ~ ma è ridondante (il carattere ~ si ottiene con Alt Gr + ì). A questo punto occorre verificare se c'è già la directory bin, cosa che possiamo fare con ls. Nel caso non ci sia la possiamo creare con

mkdir bin

Lo script lubit.sh lo dovremo copiare lì dentro. Non sarà necessario usare sudo perché siamo a casa nostra.
Con il comando

cd bin

ci trasferiremo nella directory e l'attivazione dello script sarà più semplice:

chmod +x lubit.sh

Vedete che il nome è più semplice, senza pathname e senza usare sudo per lo stesso motivo di prima.

Fatto. La prossima volta che vi logate ~/bin sarà automaticamente aggiunta alla PATH (potete verificarlo con echo $PATH).

E se volessi cambiare nome allo script, per esempio chiamarlo parla posso? Certo! e non ho nemmeno bisogno di rifare chmod.

Noi vecchi (sempre quelli di Unix) avremmo ancora parecchie cose da aggiungere, per esempio su chmod, e non solo, ma poi va a finire che diventiamo noiosi e facciamo la figura dei saputelli. Per cui se del caso, se proprio volete, potete ricorrere a man chmod. Ma sono cose che hanno scarso appeal sulle ragazze, avvisati, nèh!

lunedì 14 gennaio 2013

Gli arrays in bash

E dopo tanto tempo si ritorna finalmente a mettere mani sul Progetto Bash.

Nemmeno ricordo a quando risale l'ultimo post.

Bene! In questo articolo ci occuperemo di arrays. Ovviamente io continuo a curare la parte teorica e il caro Lightuono la parte pratica.

Ma cos'è un array?

giovedì 16 febbraio 2012

Eccoci alle funzioni!

 Salve!

Con questo post iniziamo a parlare delle funzioni. Lo so, è passato un pò di tempo dall'ultimo post, ma purtroppo non sto vivendo proprio dei bei momenti... Lasciamo stare, va. Che è meglio.

Come ormai saprete, il progetto bash non è un corso su bash, ma un invito a cimentarsi con il linguaggio bash.
Niente di più. Il nostro sforzo è tutto diretto ad esprimerci nel modo più semplice possibile. Ma la cosa bella è che sono stati in molti ad aver espresso il loro gradimento. Non può che farci tanto piacere. Veramente. :))

lunedì 12 dicembre 2011

I/O

 Salve!

Oggi ci cimenteremo con nomi di questo calibro: stdin, stdout, stderr, descrittore di file.
A parte l'espressione "descrittore di file" il resto potrebbe sembrare un pò tedesco. :) Dimenticavo, ci sarebbe anche questo: I/O 

sabato 26 novembre 2011

Come faccio ad eliminare le prime 4 righe di dieci file di testo in un colpo solo?

Metto i file di testo in una cartella appositamente creata nella directory Documenti.

Poi mi sposto in quella cartella

$ cd Documenti/mia_cartella

e lancio il seguente comando:

venerdì 25 novembre 2011

Cicli annidati

Avevo detto che il post dell'ultima volta sarebbe stato l'ultimo dedicato ai cicli, ma non è così. Ancora  mancano degli argomenti importanti quali select, break etc, etc. E sinceramente non saremmo riusciti a dormire sereni. :)
Introduco brevemente un altro argomento, quello sui cicli annidati.

mercoledì 23 novembre 2011

Come faccio a sommare i numeri contenuti in un file di testo?

Io e il caro Lightuono abbiamo deciso di dare vita ad una nuova sezione del progetto bash: "Botta e Risposta"

C'è poco da dire al riguardo, ci si pone delle domande (su bash, ovvio! :D) e si cerca di dare una risposta. Ovviamente noi daremo una risposta, ma non è detto che sia l'unica possibile.

martedì 22 novembre 2011

Il ciclo until

 Salve!

Ed eccoci al terzo ed ultimo post teorico dedicato ai cicli. Dalla prossima volta parleremo di altro. :)

Oggi ci occuperemo di until.

Il ciclo until può essere sintetizzato nei seguenti termini: "Fino a quando è falsa la condizione, esegui (itera) le istruzioni contenute tra do e done."

mercoledì 2 novembre 2011

"Iteriamo" con while

Oggi ci occuperemo del costrutto While.

Esso può essere sintetizzato con una sola frase: "Fino a quando è vera la condizione, esegue (itera) le istruzioni contenute tra do e done."

Eccone la sintassi:

lunedì 17 ottobre 2011

FORever! :)

Con il post teorico di oggi, apriamo un nuovo capitolo del "Progetto Bash."

Introduciamo, dopo esserci soffermati per molto tempo sui costrutti condizionali, i cicli.
La nostra shell, bash appunto, mette a disposizioni tre tipi di cicli:
for
while
until

giovedì 13 ottobre 2011

Fammi un case!

Da questo post cambiamo la metodologia di esposizione della parte teorica del progetto.
Il nostro timore è sempre stato quello di trasformare il "Progetto Bash" in qualcosa di troppo scolastico, di troppo formale.
E dato che il timore stava (forse) diventando realtà, abbiamo deciso di rendere più fluido (e forse anche più semplice) il discorso esponendo gli argomenti, di volta in volta trattati, sotto forma di intervista.

martedì 11 ottobre 2011

Progetto Bash: IF - Differenza tra [ & [[

Oggi parleremo della differenza tra vecchio "[" e nuovo "[["

Come ormai tutti sappiamo, "[" è il comando test e il suo compito è quello di valutare un'espressione tramite gli operatori logici. Basta digitare nel terminale

man test

oppure

man [

per capire meglio di cosa stiamo parlando.

lunedì 12 settembre 2011

Progetto Bash: IF - Exit status

Salve!

Dato che sono trascorsi più di due mesi dall'ultimo post teorico sul progetto bash cerco, in qualche modo, di richiamare alla mente alcuni concetti cardini, per poi continuare con nuovi argomenti.

Volendo trarre delle considerazioni dai post che abbiamo scritto finora, possiamo dire che
  • lo script può consistere in una semplice sequenza di comandi
  • uno script più avanzato richiede (necessariamente?!) di un costrutto condizionale.