Utilidades de ficheros: Texto, binarios y genéricas - Revision : 1,9 Herramientas de Programación— Cuadernos de Prácticas Soluciones 14 de diciembre de 2004 Resumen Ejercicios sobre la aplicación de las diferentes utilidades para el tratamiento de ficheros. Dpto. Lenguajes y Sistemas Informáticos Universidad de Alicante Índice 1. Utilidades de texto 1.1. Utilidad grep . . . . 1.2. Utilidad sed . . . . . 1.3. Utilidad sort . . . . 1.4. Utilidad cut . . . . . 1.5. Utilidad join . . . . 1.6. Utilidad cat . . . . . 1.7. Utilidad uniq . . . . 1.8. Utilidad split . . . . 1.9. Utilidad tr . . . . . . 1.10. Utilidad wc . . . . . 1.11. Utilidades more/less 1.12. Utilidades head/tail 1.13. Utilidad diff . . . . . 1.14. Utilidad patch . . . 1.15. Utilidad m4 . . . . . 1.16. Utilidad indent . . . . . . . . . . . . . . . . . . . 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 7 2. Utilidades para ficheros binarios 2.1. Utilidades ar/ranlib . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Utilidad nm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Utilidad size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 8 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4. Utilidad strip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5. Utilidad strace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 9 3. Utilidades genéricas 10 3.1. Utilidades gzip/bzip . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2. Utilidad tar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.3. Utilidad find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2 1. 1.1. Utilidades de texto Utilidad grep 1. grep alu /etc/passwd 2. grep ’^a’ /etc/passwd 3. grep ’^[ar]’ /etc/passwd 4. grep ’^[^:]*u:’ /etc/passwd 5. grep ’bash$’ /etc/passwd 6. grep -v ’bash$’ /etc/passwd 7. grep ’^[^aeiou]’ /etc/passwd 8. grep ’^[A-Z]’ /etc/passwd 9. grep ’^[^:]*:[^:]*:[0-9]:’ /etc/passwd 10. grep -E ’:[0-9]{3,5}:’ /etc/passwd 11. grep -E ’^([^:]*:){3}[0-9]{3}:’ /etc/passwd 12. grep -E ’^(root|ftp):’ /etc/passwd 13. grep -r MAXDOUBLE /usr/include 14. grep -ri bash /usr/include 1.2. Utilidad sed 1. sed -n -e ’/^a/p’ /etc/passwd 2. sed -e ’s/alu/alumno/’ /etc/passwd 3. sed -e ’s/a/A/g’ /etc/passwd 4. sed -e ’s/\/bin\/sh/\/bin\/bash/’ /etc/passwd También puede hacerse: sed -e ’s %/bin/sh %/bin/bash %’ /etc/passwd 5. sed -e ’/^a/ s %/bin/bash %/bin/sh %’ /etc/passwd 6. sed -e ’3,10 s/sh/bash/’ /etc/passwd 7. sed -e ’/^a/,$ s/sh/bash/ /etc/passwd 8. sed -e ’/^a/! s/sh/bash/’ /etc/passwd 9. sed -e ’s/:/\t/g’ /etc/passwd 3 10. sed -e ’y/aeiuo/AEIOU/’ /etc/passwd 11. sed -e ’/\/bin\/sh$/d’ /etc/passwd 12. sed -e ’s/^\([^:]*\):\([^:]*\):/\2:\1:/’ /etc/passwd 1.3. Utilidad sort 1. sort /etc/passwd 2. sort -r /etc/passwd 3. sort -f /etc/passwd 4. sort -t ’:’ -k 3 /etc/passwd 5. sort -t ’:’ -k 3 -n /etc/passwd 6. sort -t ’:’ -k 4 -n -u /etc/passwd 1.4. Utilidad cut 1. cut -d ’:’ -f 4 /etc/passwd 2. cut -d ’:’ -f 1,7 /etc/passwd 3. cut -d ’:’ -f 1,3,5-7 /etc/passwd 1.5. 1. 1.6. Utilidad join sort -k 4 -t ’:’ -n /etc/passwd >passwd sort -k 3 -t ’:’ -n /etc/group >group join -t ’:’ -1 4 -2 3 passwd group >res cut -d ’:’ -f 2,8 res Utilidad cat 1. cat /etc/passwd 2. cat -n /etc/passwd 3. cat /etc/passwd /etc/group 4 1.7. 1. Utilidad uniq Primero obtenemos una lista de los intérpretes de comandos utilizados: cut -d ’:’ -f 7 /etc/passwd >aux1 A continuación los ordenamos para que los que son iguales aparezcan juntos: sort aux1 >aux2 y eliminamos los repetidos y los sustituimos por una cuenta uniq -c aux2 >aux3 Por último ordenamos según la cuenta siguiendo un orden numérico inverso: sort -n -r aux3 1.8. Utilidad split 1. split -l 100 /usr/include/stdio.h 2. split -b 1000 /usr/include/stdio.h std- 1.9. Utilidad tr 1. tr a A </etc/passwd 2. tr aeiou AEIOU </etc/passwd 3. tr a-z A-Z </etc/passwd 4. tr a-z b-za </etc/passwd 1.10. Utilidad wc 1. wc -l /usr/include/stdlib.h 2. wc -c /usr/include/stdlib.h 3. wc -L /usr/include/stdlib.h 1.11. Utilidades more/less 1. more es una versión reducida de less. more tan sólo permite ver los ficheros moviéndose hacia delante. 2. less /usr/include/stdio.h 3. Pulsando h 4. Pulsando q 5. Pulsando 100G 6. Pulsando G 5 7. Pulsando /SEEK y la tecla de retorno de carro. 8. Pulsando n 9. Pulsando N 10. Pulsando /<.*> 1.12. Utilidades head/tail 1. head -n 5 /usr/include/stdio.h 2. tail -n 5 /usr/include/stdio.h 3. tail -f sal o tail -F sal si pensamos que hay momentos en los que el fichero puede ser borrardo o truncado. 1.13. Utilidad diff 1. Basta con ejecutar diff ordenar1.c ordenar2.c. Las lı́neas que aparecen precedidas por el carácter < sólo están en el primer fichero (fichero ordenar1.c), y las que aparecen precedidas por el carácter > sólo están en el segundo fichero (ordenar2.c) 2. Con diff -c ordenar1.c ordenar2.c si queremos verlo con el contexto copiado, o con diff -u ordenar1.c ordenar2.c si queremos que el contexto esté unificado. 3. Basta con ejecutar: diff -r Dir1 Dir2 1.14. Utilidad patch 1. diff -u ordenar1.c ordenar2.c >patch ordenar1-2.diff 2. patch ordenar1.c patch ordenar1-2.diff 3. diff -Nur Dir1 Dir2 >patch Dir1-2.diff 4. Atención: primero hay que eliminar el directorio destino (rm -r Dir2). Luego ejecutad: patch -p0 <patch Dir1-2.diff 1.15. Utilidad m4 1. define(saluda,hola) 2. define(saluda,hola $1) 3. define(saluda,‘hola $1’) 4. 6 define(saluda, ‘ifelse(‘$1’,‘Jose’, ‘Hola, viejo amigo.’, ‘Hola, ‘$1’.’)’) saluda(‘Jose’) 1.16. Utilidad indent 1. indent -gnu memoria.c 2. indent -kr memoria.c -o memoria-kr.c 3. indent -orig memoria.c -st 7 2. 2.1. Utilidades para ficheros binarios Utilidades ar/ranlib 1. ar -t /usr/lib/libm.a o ar -tv /usr/libm.a si se desea información suplementaria. 2. ar -x /usr/lib/libm.a e pow.o 3. ar -r libmmia.a e pow.o 4. ar -s libmmia.a o ranlib lib.a 5. ar -d libmmia.a e pow.o 2.2. Utilidad nm 1. nm e pow.o 2. nm /usr/lib/libm.a 3. nm /usr/lib/libstdc++XXX.a o nm -C /usr/lib/libstdc++XXX.a si se quiere ver en formato de C++ 2.3. Utilidad size 1. size ordenar.o 2. size ordenar 3. Porque estamos incluyendo la memoria usada por las librerı́as. 4. Porque una cosa es lo que ocupa el programa cuando se almacena en disco y otra cosa es la memoria que necesitará en un principio para funcionar. 2.4. 1. Utilidad strip gcc -Wall ordenar1.c -o ordenar1 ls -l ordenar1 nm ordenar1 strip ordenar1 ls -l ordenar1 nm ordenar1 8 2.5. Utilidad strace 1. strace -o sal ordenar1 2. Entre otras se puede observar una lı́nea que dice: open(/lib/tls/libc.so.6", O RDONLY) = 3 3. Ejecutad strace -o sal vi y salid inmediatamente del editor. A continuación inspeccionad el fichero sal en busca de llamadas a la función para abrir ficheros (open). 4. Primero hay que averiguar su PID y luego ejecutar: strace -p PID 9 3. 3.1. Utilidades genéricas Utilidades gzip/bzip 1. gzip stdio.h 2. gzip -l stdio.h.gz 3. gzip -d stdio.h.gz o gunzip stdio.h 4. gzip -c /usr/include/stdio.h >stdio.h.gz 5. Para comprimir midiendo el tiempo: time gzip -# grande donde # es un número del 1 al 9 según la velocidad elegida. Para ver la tasa de compresión: gzip -l grande.gz 6. Para comprimir midiendo el tiempo: time bzip2 -# grande donde # es un número del 1 al 9 que indica la velocidad elegida. 7. gzip -t grande.gz 8. gzip -t mal.gz 3.2. Utilidad tar 1. tar -cf include.tar /usr/include 2. tar -tf include.tar 3. tar -xf include.tar 4. tar -czf include.tgz /usr/include 5. tar -cjf include.tar.bz2 /usr/include 6. tar -tf include.tar */stdio.h 7. tar -xf include.tar */linux 8. tar -cMf /dev/fd0 include.tgz 9. tar -xf /dev/fd0 o tar -xMf /dev/fd0 si viene en varios disquetes. 10. tar -tf include.tgz -N ’2003-01-01’ 11. tar -tf include.tgz -N ’50 days ago’ 10 3.3. Utilidad find 1. find /usr/include -name iostream.h 2. find /usr/include -size +50k 3. find /usr/include -size +50k -not -name ’*.h’ 4. find /usr/include -not -name ’*.h’ -type f 5. find /usr/include -name ’*.h’ -exec grep MAXDOUBLE ’{}’ ’;’ -print 6. find . -name ’core.*’ -exec rm ’{}’ ’;’ 11