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
- Con faríeu un arxiu executable?
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$
- Com ho faríeu per poder comptar tots els caracters del directori actual?
ramon@portatil:~/curs$ wc -m * 94 e1 212 e2 306 total ramon@portatil:~/curs$
- Com ho faríeu per llistar els arxius que tenen permís de lectura, escriptura i execució em l'àmbit "others"?
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$
- Com ho faríeu per tal de crear un diccionari (arxiu de text) a partir de totes les paraules dels arxius del directori actual?
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
- Com ho faríeu per mostrar per pantalla totes les línies que comencin per "d" de tots els fitxers del directori actual?
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$
- Com ho faríeu per crear un diccionari amb totes les paraules que comencin per "f" de tots els fitxers del directori actual?
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$
- Com canviaríeu totes les paraules "debian" de l'arxiu "/usr/doc/at/copyright" per la paraula "redhat"?
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$
- Com canviaríeu totes les paraules "debian" que apareguin en els arxius del directori actual per la paraula "redhat"?
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$
- Com llistaríeu els bytes (tamany) dels arxius d'una carpeta determinada?
ramon@portatil:~/curs$ wc -c * 1390 copyright 79 e3 92 e4 1390 e7 2951 e8 5902 total ramon@portatil:~/curs$
- Com llistaríeu els processos actius ordenats per PID?
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:~$
- Com llistaríeu els PID de les línies del fitxer /var/log/syslog?
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
- Com llistaríeu el nom dels processos de les línies del fitxer /var/log/syslog?
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
- Com esborraríeu totes les línies d'un arxiu que comencin per #?
ramon@portatil:~/curs$ cat arxiu | sed '/^#/ d' > e13
- Com esborraríeu els espais o tabuladors que hi hagi al final de línia d'un arxiu?
ramon@portatil:~/curs$ cat arxiu | sed 's/[ ^I]*$//' > e14
- Com esborraríeu totes les línies que estiguin buides d'un arxiu?
ramon@portatil:~/curs$ cat arxiu | sed '/^$/ d' > e15
- 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?
ramon@portatil:~/curs$ cat arxiu | sed -e '/^#/ d' -e 's/[ ^I]*$//' -e '/^$/ d' > e16
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.