Sessió 6 dia 13/04

Exercicis de repàs.

Exercici 1. Con faríeu un arxiu executable?
Exercici 2. Com ho faríeu per poder comptar tots els caracters del directori actual?
Exercici 3. Com ho faríeu per llistar els arxius que tenen permís de lectura, escriptura i execució em l'àmbit "others"?
Exercici 4. Com ho faríeu per tal de crear un diccionari (arxiu de text) a partir de totes les paraules dels arxius del directori actual?
Exercici 5. Com ho faríeu per mostrar per pantalla totes les línies que comencin per "d" de tots els fitxers del directori actual?
Exercici 6. Com ho faríeu per crear un diccionari amb totes les paraules que comencin per "f" de tots els fitxers del directori actual?
Exercici 7. Com canviaríeu totes les paraules "debian" de l'arxiu "/usr/doc/at/copyright" per la paraula "redhat"?
Exercici 8. Com canviaríeu totes les paraules "debian" que apareguin en els arxius del directori actual per la paraula "redhat"?
Exercici 9. Com llistaríeu els bytes (tamany) dels arxius d'una carpeta determinada?
Exercici 10. Com llistaríeu els processos actius ordenats per PID?
Exercici 11. Com llistaríeu els PID de les línies del fitxer /var/log/syslog?
Exercici 12. Com llistaríeu el nom dels processos de les línies del fitxer /var/log/syslog?
Exercici 13. Com esborraríeu totes les línies d'un arxiu que comencin per #?
Exercici 14. Com esborraríeu els espais o tabuladors que hi hagi al final de línia d'un arxiu?
Exercici 15. Com esborraríeu totes les línies que estiguin buides d'un arxiu?
Exercici 16. Com esborrarieu totes les línies d'un arxiu que comencin per #, els espais o tabuladors que hi hagi al final de línia i totes les línies que estiguin buides d'un arxiu?

Per tal de poder fer aquests exercicis cal que consulteu els apunts de classe junt amb expressions regulars i les comandes. wc, w, pr, head, sed, awk, tail, head, cut.

Llistat de comodins (wildcards) per a expressions regulars

Exercici 1

Suposem que tenim un arxiu anomenat e1 al que li donarem permisos d'execució per a tots els usuaris i de lectura i escriptura per al propietari.

ramon@portatil:~/curs$ chmod 755 e1
ramon@portatil:~/curs$ ls -la
total 12
drwxr-xr-x  2 ramon ramon 4096 2005-04-14 06:13 .
drwxr-xr-x  4 ramon ramon 4096 2005-04-14 06:13 ..
-rwxr-xr-x  1 ramon ramon   94 2005-04-14 06:10 e1
ramon@portatil:~/curs$
Exercici 2

ramon@portatil:~/curs$ wc -m *
 94 e1
212 e2
306 total
ramon@portatil:~/curs$
Exercici 3

Solució 1:

ramon@portatil:/$ ls -la | grep 'rwx ' > ~/curs/e3
ramon@portatil:/$ cat ~/curs/e3
lrwxrwxrwx    1 root root     11 2005-04-01 01:32 cdrom -> media/cdrom
lrwxrwxrwx    1 root root     28 2005-04-01 03:12 initrd.img -> boot/initrd.img-2.6.10-5-386
lrwxrwxrwx    1 root root     28 2005-04-01 01:37 initrd.img.old -> boot/initrd.img-2.6.10-4-386
lrwxrwxrwx    1 root root     25 2005-04-01 03:12 vmlinuz -> boot/vmlinuz-2.6.10-5-386
lrwxrwxrwx    1 root root     25 2005-04-01 01:37 vmlinuz.old -> boot/vmlinuz-2.6.10-4-386
ramon@portatil:/$

Solució 2:

En primer lloc canviem els permisos a un parell d'arxius. En realitat això no calia, però és que no tenia cap arxiu amb aquests permissos ;)

ramon@portatil:~/curs$ ls
e1  e2  e3
ramon@portatil:~/curs$ chmod 747 e1 e2
ramon@portatil:~/curs$ ls -la
total 20
drwxr-xr-x  2 ramon ramon 4096 2005-04-14 06:52 .
drwxr-xr-x  4 ramon ramon 4096 2005-04-14 06:13 ..
-rwxr--rwx  1 ramon ramon   94 2005-04-14 06:10 e1
-rwxr--rwx  1 ramon ramon  212 2005-04-14 06:15 e2
-rw-r--r--  1 ramon ramon  439 2005-04-14 06:20 e3
ramon@portatil:~/curs$

Ara busquem els que tenen permisos de lectura, escriptura i execució per a altres usuaris.

ramon@portatil:~/curs$ find -perm -007
./e1
./e2
ramon@portatil:~/curs$
Exercici 4

Solució 1: Elimina les repeticions i qualsevol caràcter que no sigui una lletra (a-z), a més converteix el text a minúscules i ordena les paraules alfabèticament.
Escric aquí la solució perquè és tant llarga que no es veu bé al terminal:
cat * | sed 's: :\r\n:g' | tr 'A-Z' 'a-z' | sed 's:[^a-z]::g' | sort -u > ~/curs/e4

ramon@portatil:~/curs$ ls
e3
ramon@portatil:~/curs$ cat e3
Per tal de poder fer aquests exercicis cal que consulteu els apunts de classe.
ramon@portatil:~/curs$ cat * | sed 's: :\r\n:g' | tr 'A-Z' 'a-z' | sed 's:[^a-z]::g' | sort -u > ~/curs/e4
ramon@portatil:~/curs$ cat e4
apunts
aquests
cal
classe
consulteu
de
els
exercicis
fer
per
poder
que
tal
ramon@portatil:~/curs$

Solució 2: Aquest també fa el mateix que l'anterior però per un mètode diferent.
awk '{for (i=1;i<=NF;i++) print $i}' * | tr 'A-Z' 'a-z' | sed 's:[^a-z]::g' | sort -u > ~/curs/e4

ramon@portatil:~/curs$ awk '{for (i=1;i<=NF;i++) print $i}' * | tr 'A-Z' 'a-z' | sed 's:[^a-z]::g' | sort -u > ~/curs/e4
ramon@portatil:~/curs$ cat e4
apunts
aquests
cal
classe
consulteu
de
els
exercicis
fer
per
poder
que
tal
ramon@portatil:~/curs$

Solució 3: Aquesta solució la he trobat per la Internet. Crea el diccionari d'un únic arxiu i no de tots els arxius d'un directori. Està feta amb un shell script.

#!/bin/bash
# makedict.sh  [make dictionary]

# Modification of /usr/sbin/mkdict script.
# Original script copyright 1993, by Alec Muffett.
#
#  This modified script included in this document in a manner
#+ consistent with the "LICENSE" document of the "Crack" package
#+ that the original script is a part of.

#  This script processes text files to produce a sorted list
#+ of words found in the files.
#  This may be useful for compiling dictionaries
#+ and for lexicographic research.


E_BADARGS=65

if [ ! -r "$1" ]                     #  Need at least one
then                                 #+ valid file argument.
  echo "Usage: $0 files-to-process"
  exit $E_BADARGS
fi  


# SORT="sort"                        #  No longer necessary to define options
                                     #+ to sort. Changed from original script.

cat $* |                             # Contents of specified files to stdout.
        tr A-Z a-z |                 # Convert to lowercase.
        tr ' ' '\012' |              # New: change spaces to newlines.
#       tr -cd '\012[a-z][0-9]' |    #  Get rid of everything non-alphanumeric
                                     #+ (original script).
        tr -c '\012a-z'  '\012' |    #  Rather than deleting
                                     #+ now change non-alpha to newlines.
        sort |                       # $SORT options unnecessary now.
        uniq |                       # Remove duplicates.
        grep -v '^#' |               # Delete lines beginning with a hashmark.
        grep -v '^$'                 # Delete blank lines.

exit 0	
Exercici 5

ramon@portatil:~/curs$ cat * | grep ^[dD] > ~/curs/e5
ramon@portatil:~/curs$ cat e5
doesn't seem to be any other upstream source, the only upstream source.
de
de
ramon@portatil:~/curs$
Exercici 6

Elimina les repeticions i qualsevol caràcter que no sigui una lletra (a-z), a més converteix el text a minúscules i ordena les paraules alfabèticament.
Escric aquí la solució perquè és tant llarga que no es veu bé al terminal:
cat * | sed 's: :\r\n:g' | grep ^[fF] | tr 'A-Z' 'a-z' | sed 's:[^a-z]::g' | sort -u > ~/curs/e6

ramon@portatil:~/curs$ cat * | sed 's: :\r\n:g' | grep ^[fF] | tr 'A-Z' 'a-z' | sed 's:[^a-z]::g' | sort -u > ~/curs/e6
ramon@portatil:~/curs$ cat e6 failure
fatal
fer
first
fitness
for
found
foundation
frame
free
full
ramon@portatil:~/curs$
Exercici 7

Canvia les paraules 'debian' o 'Debian' per 'redhat', i fins i tot les paraules derivades de 'debian'. Per exemple: 'debianized' per 'redhatized'.

ramon@portatil:~/curs$ cat /usr/doc/at/copyright | sed 's:[dD]ebian:redhat:g' > ~/curs/e7
ramon@portatil:~/curs$ cat e7
This is the redhat GNU/Linux prepackaged version of the deferred
execution scheduler called at.

This package was redhatized by its author Thomas Koenig
<ig25@rz.uni-karlsruhe.de>, taken over and re-packaged first by Martin
Schulze <joey@redhat.org> and then by Siggy Brentrup <bsb@winnegan.de>,
and then taken over by Ryan Murray <rmurray@redhat.org>.

... El tallo aquí perquè no sigui tant llarg ...

ramon@portatil:~/curs$
Exercici 8

ramon@portatil:~/curs$ cat * | sed 's:[dD]ebian:redhat:g' > ~/curs/e8
This is the redhat GNU/Linux prepackaged version of the deferred
execution scheduler called at.

This package was redhatized by its author Thomas Koenig
<ig25@rz.uni-karlsruhe.de>, taken over and re-packaged first by Martin
Schulze <joey@redhat.org> and then by Siggy Brentrup <bsb@winnegan.de>,
and then taken over by Ryan Murray <rmurray@redhat.org>.

... El tallo aquí perquè no sigui tant llarg ...

ramon@portatil:~/curs$
Exercici 9

ramon@portatil:~/curs$ wc -c *
1390 copyright
  79 e3
  92 e4
1390 e7
2951 e8
5902 total
ramon@portatil:~/curs$
Exercici 10

Solució 1: Els PID i els noms dels processos

ramon@portatil:~/curs$ ps ax -o pid,command
  PID COMMAND
    1 init [2]
    2 [ksoftirqd/0]
    3 [events/0]
    4 [khelper]
   22 [kacpid]
  108 [kblockd/0]
  143 [pdflush]

... El tallo aquí perquè no sigui tant llarg ...
 
10129 gnome-terminal
10130 gnome-pty-helper
10131 bash
10953 gedit
12919 pickup -l -t fifo -u -c
13198 ps ax -o pid,command
ramon@portatil:~/curs$

Solució 2: Només els PID

ramon@portatil:~$ ps axl | awk '{ print $3 }'
PID
1
2
3
4
22
108
143
144
146
... El tallo aquí perquè no sigui tant llarg ...
ramon@portatil:~$
Exercici 11

Solució 1: Separo les línies que contenen PID.

ramon@portatil:~/curs$ cat /var/log/syslog | grep -e \(*[0-9]*\) > ~/curs/e11
ramon@portatil:~/curs$ cat e11
Apr 14 05:49:06 localhost anacron[7115]: Job `cron.daily' terminated (mailing output)
Apr 14 05:49:07 localhost postfix/local[7988]: 8B2F0A3926: to=<ramon@portatil.site>, orig_to=<root>, relay=local, delay=1, status=sent (delivered to mailbox)
Apr 14 05:51:32 localhost anacron[7115]: Normal exit (2 jobs run)

... El tallo aquí perquè no sigui tant llarg ...
 
Apr 14 07:30:01 localhost /USR/SBIN/CRON[10181]: (root) CMD (test -x /etc/init.d/anacron && /usr/sbin/invoke-rc.d anacron start >/dev/null)
Apr 14 07:30:02 localhost anacron[10204]: Normal exit (0 jobs run)
Apr 14 09:17:01 localhost /USR/SBIN/CRON[11739]: (root) CMD (   run-parts --report /etc/cron.hourly)
Apr 14 10:17:01 localhost /USR/SBIN/CRON[12573]: (root) CMD (   run-parts --report /etc/cron.hourly)
ramon@portatil:~/curs$

Solució 2: Aquí separo només els PID. El mètode no és cap meravella, ho he intentat de formes més adients però no ho aconseguia.
cat /var/log/syslog | sed 's:\[:\r\n:g' | grep ^[0-9] | sed 's:\]:\r\n:g' | grep ^[0-9] > ~/curs/e11

ramon@portatil:~/curs$ cat /var/log/syslog | sed 's:\[:\r\n:g' | grep ^[0-9] | sed 's:\]:\r\n:g' | grep ^[0-9] > ~/curs/e11
ramon@portatil:~/curs$ cat e11 
7115
7986
7988
7115
8037
7115

... El tallo aquí perquè no sigui tant llarg ...

10204
10859
11739
12573
13464
Exercici 12

Escric aquí la solució perquè és tant llarga que no es veu bé al terminal
cat /var/log/syslog | sed 's:\([a-zA-Z]\)\{3\}[ ]*\([0-9]\)\{1,2\} \([^ ]*\) \([^ ]*\) \([^[]*\).*:\5:g'

ramon@portatil:~/curs$ cat /var/log/syslog | sed 's:\([a-zA-Z]\)\{3\}[ ]*\([0-9]\)\{1,2\} \([^ ]*\) \([^ ]*\) \([^[]*\).*:\5:g' > ~/curs/e12
ramon@portatil:~/curs$ cat e12 
syslogd 1.4.1#16ubuntu6: restart.
anacron
postfix/cleanup
postfix/local
anacron
anacron
exiting on signal 15
syslogd 1.4.1#16ubuntu6: restart.
anacron
anacron
kernel: NETDEV WATCHDOG: wlan0: transmit timed out
kernel: acx100: Tx timeout!
udev
udev
udev
kernel: usb 1-1: USB disconnect, address 3
/USR/SBIN/CRON
anacron
anacron
/USR/SBIN/CRON
/USR/SBIN/CRON
Exercici 13

ramon@portatil:~/curs$ cat arxiu | sed '/^#/ d' > e13
Exercici 14

ramon@portatil:~/curs$ cat arxiu | sed 's/[ ^I]*$//' > e14
Exercici 15

ramon@portatil:~/curs$ cat arxiu | sed '/^$/ d' > e15
Exercici 16

ramon@portatil:~/curs$ cat arxiu | sed -e '/^#/ d' -e 's/[ ^I]*$//' -e '/^$/ d' > e16
Llistat de comodins (wildcards) per a expressions regulars


Caràcter /
Estructura
Descripció Exemple(s)
[ ] Els claudators s'utilitzen per definir rangs [0-9] o [a-zA-Z] o un més complet [A-Za-z0-9,.-_]
\{ \} Les claus s'utilitzen per definir la quantitat de cops que ha de repetir-se un patró (o àtom). ELEMENT\{3,7\} farà que ELEMENT hagi d'ocórrer entre 3 i 7 cops. I ELEMENT\{4\} farà que ELEMENT hagi d'ocòrrer exactament 4 cops.
\( \) Ens permet crear 'àtoms'. Tot allò que estigui entre parèntesi serà considerat un 'àtom'. \([0-9]*Hola\) Cercará una possible seqüència de números precedint a la paraula Hola.
* Indica que un àtom o element podrà o no existir i en cas de existir podrà ocórrer qualsevol quantitat de cops.ELEMENT*
. Equival a qualsevol caràcter (un sol). s:.::g Esborrarà tota l'entrada.s:.*:A:g Canviarà cada línia per 'A'. s:.:A:g Canviarà cada caràcter de l'entrada per una 'A'.
^Simbolitza el principi de línia. ^$ simbolitza una línia en blanc.
[^ ] Crea un rang que conté qualsevol caràcter menys els especificats entre [^ i ]. [^xyz,] crea un rang que conté a tots els caracters menys x, y, z i ,.
$ Simbolitza el final de línia.\.$ Concorda amb les línies que acaben en ..

Per extreure el contingut literal d'un dels àtoms utilitzarem la sintaxi: \n on n és el número de l'àtom que volem extreure.


copyleft © 2014 ramon lopez
última actualització 16/09/14 17:23