Bourne shell = Arranca con .profile. Para pasar a este shell uso sh. Se asignan variables asi: variable=valor
Korn shell = Arranca con .profile, ademas lee el archivo adicionales .kshrc. Para pasar a este shell uso ksh. Para correr un archivo hago . ./file. Se asignan variables asi: variable=valor
C shell = Arranca con .login, ademas lee el archivo adicionales .cshrc. Para pasar a este shell uso csh. Para correr un archivo hago csh file. Se asignan variables asi: set variable valor
Managing Files
and Directories:
ls -F=
Lista archivos y directorios diferenciandolos
mkdir= Crea un Directorio
cd= Cambia a directorio
rmdir= Borra un directorio
cp (-r o p)= Copia archivos. Si se usa con –r, entonces copia recursivamente (incluye subdir). Si se usa con p, conservara las fechas originales del archivo
mv= Mueve un archivo o directorio
rm (-r)= Borra un archivo, si se lo usa con –r, lo hace recursivamente
file arch= Muestra de que clase es ese archivo
cat o more = Veo el contenido de un archivo. A car generalmente lo uso para enganchar 2 archivos en uno
pg file= Veo el archivo pagina por pagina. Con + y – subo o bajo paginas, con ENTER baja, q es exit, con un Nº va a esa pagina, con $ va a la ultima y con +5 bajara 5 paginas.
compressfile = Comprime a un archivo.
uncompres file = Descomprime el archivo
diff file1 file2 = Displays on standard output the differences between file1 and file2.
Opciones:
-t = ignora blancos y tabs
-e =
-h =
-i = ignora ‘case’ letters (A=a)
head -n filename =Se usa para ver las primeras ‘n’ lineas de un file.
tail -n filename = Se usa para ver las ultimas ‘n’ lineas.. Con la opcion –f, lo voy viendo a medida que crece
wc = This utility displays a count of the number of characters, words and lines in a file. The switches for this utility are
-lprint line count
-cprint character count
-wprint word count
grep= The grep command searches a file for a pattern. Using the * wildcard specifies all files, and using the switch -n will display on which line the text string is found. Opciones:
-l = Lista los archivos que contienen esa palabra
-c = cuenta las apariciones
-i = No distingue entre mayusculas y minusculas
-n = Muestra los numeros de linea
-v = Imprime las lineas que NO tienen esa palabra
-f= Las palabras a buscar estara en un archivo
find = - Se usa para buscar archivos o directorios. Toma como argumentos declaraciones en formato
"find <directorio base> <opciones> -print"
-Para sacar en pantalla los ficheros llamados pepe.txt uso:
find / -name pepe.txt -print
- Para buscar todos los ficheros y directorios que tengan más de 30 días de antigüedad :
find / -atime +30 –print
Opciones:
-
print: muestra por pantalla los archivos con sus trayectoria completa
$
find /usr –print
-
perm: acompaña a una notación en formato octal. Busca desde
un directorio determinado todos los archivos que tienen el acceso indicado
en octal.
$
find /usr -perm 777
$
find /usr -perm 666 -print
Busca
todos los archivos activos en r, w y x para u, g y o y los presenta.
-
user: busca todos los archivos que pertenecen a un usuario en concreto.
$
find /usr -user pepe
$
find /usr -user pepe –print
-
atime n: busca todos los archivos a los que se ha accedido en n días.
touch filename = Se usa para ponerle la fecha de hoy a un archivo
sort <opciones> <indicador de campo> <fichero>
Ordena un fichero de acuerdo a una secuencia de odenacion determinada.
Ejemplo dado un fichero con:
codigo nombre ciudad telefono
$ sort fichero # ordena por todos los campos
$ sort +1 fichero # ordena a partir del campo 1 (nombre; codigo es el 0)
$ sort +2n fichero # ordena por nombre, en secuencia invertida.
$ sort +2n -t":" fichero # igual que antes, pero suponiendo que el separador es ":".
lpstat [-s] = Muestra el estado de la impresora
lp [-d print_queue] file_specification =Print a file
lpq -P = Muestra el estado de la impresora
lprm [job or -] = The - option will remove all jobs from the print queue
*
ftp?> Para poder conectarnos con
otra máquina y poder traer ficheros.
Subordenes:
*
help
*
open?> abre
la sesion de ftp
*
close ?> cierra
la sesion de ftp
*
bye?>
Nos devuelve al prompt del UNIX < $ >
*
bin?> Activa
el modo binario
*
ascii ?>
Activa el modo ascii
*
hash?>
Para ver graficamente como va el proceso de download
*
get?> get
< filename > Se trae un archivo concreto
*
mget?>
mget * Se trae todos los archivos
*
put?> Lo
contrario de get.
*
abort ?> Anula
último comando si no ha terminado de ejecutarse
*
! ?> Solo
ordenes del DOS. Ej: !a: !dir c:\juegos
*
lcd a: ?> Y
me puedo traer las "cosas" al diskete a:
su – username = Cambio de usuario
man –k comando = Me da una sintesis de ese comando
xman= Consulta manual en forma grafica
stty erase = Si no funciona el backspace
passwd = The utility asks for the new password (twice, to make sure you didn't misspell it).
df –k= Veo espacio disponible en los discos
du= Veo el uso de los discos
who= Muestra usuarios en el sistema y tiempo de conecccion
script logfile = Hace un log de todo lo que voy escribiendo hasta que ponga exit
Uname -a = Imprime el nombre del sistema
which command = Display where is that command (in which directory)
cal= Muestra un calendario
rlogin= Remote login a otro sistema sin preguntar el password
rusers= Veo usuarios en el otro sistema
ping host = Comprueba si existe comunicacion con el host
rcp [-r] sourcehost:filename destinationhost:filename = Copia un archivo de un host a otro
ln= Se usa para linkear archivos, esto es que uno de los archivos apunte a otro. Entonces si uno
cambia, el otro tambien. El parámetro -s crea un link simbolico. Por ejemplo para crear un link en
$ORACLE_HOME/dbs que apunte al archivo initSMS.ora que esta en /home/dpafumi hacemos
(parados en el lugar donde creare el link):
$ORACLE_HOME/dbs> ln -s/home/dpafumi/initSMS.ora initSMS.ora
chown = Cambia al owner del file
chgrp = Cambia al grupo owner del file
chmod = Da permisos de escritura, lectura y/o ejecucion
chmod (ugao)(+-=)(rwx)
file_specification ...
u = Permisos del usuario (owner)
g = Group premission
O = Others
+ = Da acceso
- = Quita el acceso
r = Permiso de lectura
w = Permiso de escritura
x = Permiso de Ejecucion
EJ:
$
ls -l f1
-rw-r--r--
1 user3 clase 37 Jul 24 11:06 f1
$
chmod g=rw, o= f1
$
ls -l f1
-rw-rw----
1 user3 clase 37 Jul 24 11:06 f1
$
ls -l f2
-rw-rw-rw-
1 user3 clase 48 Jul 24 11:08 f2
$
chmod u+x, g=rx, o=rw f2
$
ls -l f2
-rwxr-x---
1 user3 clase 48 Jul 24 11:08 f2
&= Hace que un trabajo se ejecute en background
nohup comando& = Hace que el trabajo siga aun cuando yo me desconecte
fg= Trae un proceso a primer plano
bg= Manda un proceso al background
jobs= Para ver los trabajos corrientes
ps –f= Veo todos mis procesos
ps –ef= Veo todos los procesos
Kill= Elimina un proceso, se usa con el numero del proceso
Id= Este comando nos devolverá "uid" (UserID), identificador de usuario, un número y un
nombre (129 y jose); "gid" (GroupID), identificador de grupo, un numero y un nombre
top= Muestra cuales son los procesos que consumen mas memoria
talk= Abre chatear con otro usuario. Pongo talk username, del otro lado deben poner lo mismo.
Mensaje a todos =1. Crear un file con el mensaje
2. /usr/sbin/wall < file
Busco files cambiados n dias atras = find / -ctime –0 –print –exec touch ‘{}’ \; >/tmp/file2000
exec=Este comando se usa para que se ejecuten varias tareas al mismo tiempo. Por ejemplo:
- find . -name basura.txt-exec rm {}Busca y Borra el archivo basura
dosdir= Lista el contenido de un diskette formateado en DOS
dosread <archivo diskette> <archivo Unix>= Copia un archivo DOS del diskette al Unix
doswrite <archivo Unix> <archivo diskette> = Copia un archivo Unix al diskette
set -o vi= Permite desplegar comandos como doskey usando Esc y k
alias= Crea un alias para un comando. Ejemplo:
alias dir=”ls -la” $dir ; export dir
awk= Es en si un lenguaje de programacion. Lo que hace es leer lineas de un archivo, cada linea se parte
en campos separadas por blancos. A cada linea se le aplica uno o mas procedimientos.
Finger= Indica los usuarios loggeados, su ID, nombre y nombre de la maquina
uptime -w = Muestra desde hace cuanto esta funcianando el server y cantidad de usuarios conectados
lock= Lockea el equipo hasta que se tipea la palabra
Crear usuario = useradd –u Nºempleado –g Grupo –G otro_grupo –d directorio_de_arranque –s shell –c
“comentarios” –m username
Opciones del useradd:
-u UID à Define el UID de usuario.
-oà Utilizar esta opción con –u para utilizar UID no unicos en el sistema.
-g grupo à Define un ID de grupo o asigna uno existente.
-d dir à Directorio de conexión del usuario.
-s shell à Del de arranque.
-e expira à Fecha en que una presentación expira.
-f inactivo à Establece el número de diás que la presentación puede estar inactiva.
Agregar grupo = groupadd –g Nº name
Borrar grupo = groupdelname
Borrar usuario = userdel –r username (la r borra su directorio de trabajo)
Permiso al comenzar = passwd –f usuario(lo obligo a cambiar el password)
Desmonto Disco = umount label /oracle/oracle7
Formateo = format
Monto con opcion en archivo de arranque = mount –a
Montar tape = mt –f /dev/rmt/0mn rewind, status
Monto = mount /dev/dsk/... /nombre_dir_al_que_monto
File vfstab = Es como el congif.sys
Admintool = Herramienta de administracion de usuarios
SAM = Herramienta de Administracion de todo el sistema
Agregar disco = 1- Creo dirmkdir /oracle.xxxx
2- chown dpafumi new_dir
3- chgrp dba new_dir
4- ls /dev/dskVeo todos los controllers usados y los que no
5- df –k Veo los instalados
6- Tomo uno NUEVO del punto 4 que siga en secuencia, y lo formateo (en gral es .....s2)
7- format /dev/rdsk/c2t2d0s2(este es el nombre del controlador)
a.PartitionPrint= veo como esta dividido
miro los Nº y los arreglo
Por ultimo hacer label para que se grabe todo
8- Pongo el nuevo file system haciendo: newfs /dev/dsk/c2t2d0s2
9- Lo agrego en orden en el archivo vfstab
10- umount /oracle/xxx
11- mount -a
Shutdown = shutdown –g 10 –i 5
Hacer imagen de un file system =
1- Tomo un disco y o divido igual que el origen
2- volcopy –a –F ufs /name_direct /source_device - /dest_device_con_mismo_numero
Ej: volcopy –a –F ufs /home /dev/rdsk/c0t3d0s3 - /dev/rdsk/c1t2d0s3
Recompilar devices = reboot -- -r(previamente hacer touch /reconfigure)
INIT
= El sistema tienen un estado por omisión que se guarda en el
archivo /etc/inittab, que contiene una linea con INITDEFAULT y un nº
con el INIT por defecto en arranque (=2 Multiusuario en red local).
Durante
la sesión se puede cambiar el INIT con la orden:
$init
nn
El
el Shutdownà
La opción –i permite establecer el INIT del siguiente arranque sin
tocar el INITDEFAULT
Valores
INIT.
Ø0 à
Estado de desconexión o máquina desconectada. Diagnosticos
de hardaware.
Ø1 à
Estado monousuario o administrativo (Anula procesos terminales) . Cambias
en la configuración.
ØS
o s à
Equivalente al 1. Diferencia es que los sistemas de archivos no estan montados
(No hay ni archivos ni procesos).
Ø2 à
Multiusuario. Modo normal de operación. INIT por defecto.
Ø3 à
Para poder usar el sistema remoto de ficheros. Se puede arrancar directamente
o al añadirse los sistemas RFS (Remote File System).
Ø4 à
Estado definido por el usuario.
Ø5 à
Estado firmware. Para hacer pruebas especiales. Arranque del sistema desde
diferentes archivos de arranque.
Ø6 à
Estado de parada o arranque.
Øa,b,c à
Pseudo estados. Dentro del inittab se pueden definir pseudoestados, ejecuta
el pseudo estado y vuelve al INIT por defecto.
ØQ à
Si se realizan modificaciones. Lee el archivo inittab y se desea iniciarlo
sin cambiar el estado actual.
Shutdownà
Orden de desconexion del sistema y se utilizan tambien para pasar a un
estado más bajo. La razon de su utilización es la posibilidad
de conceder un periodo de gracia a los demás usuarios antes de desconectar
la máquina.
#shutdown
–y –g{tiempo}.
A una cinta, puedo ponerle mas de un set de archivos si agrego la opcion ‘n’ (no rewind) como parte del nombre del tape. El tape NO se rebobina luego de que se copian los archivos, y la proxima vez que se use el tape, los archivos seran escritos al final de los archivos existentes.
TAR = Se utiliza para comprimir, descomprimir o ver el contenido de un archivo. Sus opciones son:
·Ve el contenido del archivo = tar tvf tar_file
·Extraer archivos= tar xvf tar_file archi1, archi2
· Comprimir un archivo = tar cvf tar_file archivo o *.sql o file1, file2
·Comprimir varios archivos de distintos directorios =
tar cvf tar_file –c /dir1/* -c /dir2/* tar cvf tar_file –I file_con_lista_de _dirs
·Agregar al comprimido = tar rvf tar_file file
Opciones:
-r à Añade el fichero nombrado al final del tar.
-x à Extrae del archivo tar los fichero que se indiquen.
-t à Lista los nombres de todos los ficheros del archivo tar.
-c à Crea un nuevo archivo, empezando la escritura al principio.
-v à Activa el modo de comentario extenso y veo a medida que se procesan.
-w à Activa modo de conformación.
-u à El archivo indicado se agrega al TAR si no existe o si es mas Nuevo que el que existe
-m à Extrae el archivo con fecha y hora original (se usa con x)
-o à Extrae los archivos con owner y group de la persona que corre el programa
CPIO = Como ventaja tiene que marca los errores y que utiliza varios tapes.
·Para copiar = ls *.txt | cpio –oc > /dev/rmt/0(-o = copia los arch, -c = copia los headers_
·Para listar = cpio –civt < /dev/rmt/0 (-i = lee el contenido del tape, -v = muestra como ls-l)
·Para extraer (ATENCION!! Si se creo con relative patch, entonces los pone donde esta parado, pero si se creo con absolute path, entonces los pone en el lugar original y sobreescribe los archivos) = cpio –icv < /dev/rmt/0
cpio –icvfile < /dev/rmt/0
Donde Argumento es:
Status
Rew
Offline = hace eject
Fsf x = Adelanta ‘x’ archivos, entonces si estoy al ppio y quiero ir al 3ro hago mt –f /dev/.. fsf 2
Bsf x = Igual a fsf pero para atras
Eom = Va hasta el final del ultimo archivo grabado (util para agregar mas info al tape)
< Acepta la entrada desde un fichero.
> Envía la salida estándar a un fichero.
>> Añade la salida a un archivo existente. Si no existe, se crea.
| El comando a la derecha toma su entrada del comando de la izquierda. El comando de la derecha debe estar programado para leer de su entrada; no valen todos.
Por ejemplo, ejecutamos el programa "cal" que saca unos calendarios muy aparentes. Para imprimir la salida del cal, y tener a mano un calendario sobre papel, podemos ejecutar los siguientes comandos :
cal 1996 > /tmp/cosa y luego lp /tmp/cosa
o
cal 1996 | lp
Y la interconexión no está limitada a dos comandos; se pueden poner varios, tal que así:
cat /etc/passwd | grep -v root | cut -d":" -f2- | fold -80 | lp
(del fichero /etc/passwd sacar por impresora aquellas líneas que no contengan root desde el segundo campo hasta el final con un ancho máximo de 80 columnas).
- Comandos a
ejecutar en diferido : at, batch y cron.
Estos tres comandos ejecutan comandos en diferido con las siguientes diferencias :
AT lanza comandos una sola vez a una determinada hora.
BATCH lanza comandos una sola vez en el momento de llamarlo.
CRON lanza comandos varias veces a unas determinadas horas, días ó meses.
Estos comandos conviene tenerlos muy en cuenta fundamentalmente cuando es necesario ejecutar regularmente tareas de administración ó de operación. Ejemplos de situaciones donde éstos comandos nos pueden ayudar son :
- Necesitamos hacer una grabacion en cinta de determinados ficheros todos los días a las diez de la mañana y los viernes una total a las 10 de la noche = CRON.
- Necesitamos dejar rodando hoy una reconstrucción de ficheros y apagar la máquina cuando termine ( sobre las 3 de la mañana ), pero nos queremos ir a casa (son ya las 8) =AT
- Necesitamos lanzar una cadena de actualización, pero estan todos los usuarios sacando listados a la vez y la máquina está tumbada = BATCH
-Comando at <cuando> <comando a ejecutar>
Ejecuta, a la hora determinada, el <comando>. Puede ser una shell-script, ó un ejecutable. Este comando admite la entrada desde un fichero ó bien desde el teclado. Normalmente, le daremos la entrada usando el "here document" de la shell. El "cuando" admite formas complejas de tiempo. En vez de contar todas, veamos algunos ejemplos que seguro que alguno nos cuadrará :
* Ejecutar la shell "salu2.sh" que felicita a todos los usuarios, pasado mañana a las 4 de la tarde:
# at 4pm + 2 days <<EOF
/usr/yo/salu2.sh
EOF
* Lanzar ahora mismo un listado:
at now + 1 minute <<EOF
"lp -dlaserjet /tmp/balance.txt"
EOF
* Ejecutar una cadena de reindexado de ficheros larguísima y apagar la máquina:
at now + 3 hours <<EOF
"/usr/cadenas/reind.sh 1>/trazas 2>&1; shutdown -h now"
EOF
* A las 10 de la mañana del 28 de Diciembre mandar un saludo a todos los usuarios :
at 10am Dec 28 <<EOF
wall "Detectado un virus en este ordenador"
EOF
* A la una de la tarde mañana hacer una salvita :
at 1pm tomorrow <<EOF
/home/Salvas/diario.sh
EOF
De la misma manera que el comando nohup, éstos comandos de ejecución en diferido mandan su salida al mail, por lo que hay que ser cuidadoso y redirigir su salida a ficheros personales de traza en evitación de saturar el directorio /var/mail.
El comando "at" asigna un nombre a cada trabajo encolado, el cual lo podemos usar con opciones para consultar y borrar trabajos:
at -l = Lista todos los trabajos en cola, hora y día de lanzamiento de los mismos y usuario.
at -d <trabajo> = Borra <trabajo> de la cola.
Ya que el uso indiscriminado de éste comando es potencialmente peligroso, existen dos ficheros que son inspeccionados por el mismo para limitarlo : at.allow y at.deny. (Normalmente residen en /usr/spool/atjobs ó en /var/a t).
at.allow:si existe, solo los usuarios que esten aquí pueden ejecutar el comando "at".
at.deny:si existe, los usuarios que estén aquí no estan autorizados a ejecutar "at".
El "truco" que hay si se desea que todos puedan usar at sin tener que escribirlos en el fichero, es borrar at.allow y dejar sólo at.deny pero vacío.
- Batch.
Ejecuta el comando como en "at", pero no se le asigna hora; batch lo ejecutará cuando detecte que el sistema se halla lo suficientemente libre de tareas. En caso que no sea así, se esperará hasta que se libere.
-Cron.
No es un comando; es un "demonio", ó proceso que se arranca al encender la máquina y está permanentemente activo. Su misión es inspeccionar cada minuto los ficheros crontabs de los usuarios y ejecutar los comandos que allí se digan a los intervalos horarios que hayamos marcado. Como se acaba se señalar, los crontabs son dependientes de cada usuario.
Se deben seguir los siguientes pasos para modificar, añadir ó borrar un fichero crontab :
1 - Sacarlo a fichero usando el comando "crontab -l >/tmp/mio", por ejemplo.
2 - Modificarlo con un editor de acuerdo a las instrucciones de formato que se explican a continuación.
3 - Registrar el nuevo fichero mediante el comando "crontab /tmp/mio", por ejemplo.
Mira cada minuto el directorio /var/spool/crontabs (en SUN) o /var/spool/cron/crontabs (en HP) y ejecuta los comandos crontab. El formato del fichero es el siguiente :
#minutos horas dia mes mes dia-semana comando ( # = comentario )
minutos : de 0 a 59.
horas : de 0 a 23.
dia del mes : de 0 a 31.
mes : de 0 a 12.
día semana : de 0 a 6 ( 0 = domingo, 1 = lunes...)
Aparte de la especificación normal, pueden utilizarse listas, es decir, rangos de valores de acuerdo con las siguientes reglas :
8-11 : Rango desde las 8 hasta las 11 ambas inclusive.
8,9,10,11 : Igual que antes; desde las 8 hasta las 11.
Si queremos incrementar en saltos diferentes de la unidad, podemos escribir la barra "/" :
0-8/2 : Desde las 12 hasta las 8 cada 2 horas. Equivale a 0,2,4,6,8.
El asterisco significa "todas" ó "todo". Por tanto :
*/2 : Cada dos horas.
Ejemplos más evidentes :
# ejecutar una salvita todos los dias 5 minutos despues de las 12 de la noche :
5 0 * * * /home/salvas/diaria.sh 1>>/home/salvas/log 2>&1
# ejecutar a las 2:15pm el primer dia de cada mes:
15 14 1 * * /home/salvas/mensual.sh 1>/dev/null 2>&1
# ejecutar de lunes a viernes a las diez de la noche - apagar la maquina que es muy tarde
0 22 * * 1-5 shutdown -h now 1>/dev/null 2>&1
# ejecutar algo cada minuto
* * * * * /home/cosas/espia.sh
C Shell Variables
set [variable=value] = Sets the values for a variable
history = The history variable is usually set in the user's .login file. El !! repite el ultimo comando y el !letra, repite el comando que empiece con esa letra
alias [new name] [command] = Without options prints out the users current list of command aliases. With
only the new command name as an option lists the associated command for the aliased name.
unalias user command alias or * = Removes an alias
env = Displays all the rnvironment variables
Es una de
las cosas más fáciles de explicar y con lo que más
problemas vamos a tener.
Es una herramienta
de programación. Se aproxima a la programación funcional.
Se divide
en patrones y acciones. (Acciones asociadas a patrones)
Acciones à
Lenguaje C
Awk se encarga
de leer la entrada ( normalmente la estándar). La divide en registros.
(Cada registro es una linea à
Separador de registros(¿))
Para
cada registro buscamos concordancia con algún patrón, si
se produce concordancia ejecuta la acción asociada al patrón
sobre el registro.
Awk
es un traductor. (La entrada puede ser una cosa, y la salida otra)
La
sintaxis de awk es de dos tipos :
awkpatrón
{acción} ; patrón {acción} ;...´ [fichero de
entrada]
awk
-f fich.prog[fichero de entrada]
-fà
Indica separador de campo.
-và
Asignación de valor.
PATRONES
:
Los patrones
son los encargados de resolver la entrada.
Funciona
como un gigantesco CASE.
Si no hay
patrón para una acción se ejecuta sobre todas las líneas
de ficheros.
Patrón
vacío es cualquier o ningún registro.
Tipos de
patrones :
a. Patrón
constante : Son
cadenas de caracteres fijas situadas entre barras ‘ / ’ y para las que
se busca la aparición en cualquier punto del registro.
Ej.
/patata/{print}à
Busca la cadena patata en cualquier posición
b. Expresiones
regulares : Son
combinaciones de caracteres y operadores de carácter. Los operadores
permitidos son
^à
Principio de línea.
$à
Fin de línea.
[
] à
Clase de caracteres.
|à
OR
*à
Cero o más apariciones.
+à
Una o más apariciones.
?à
Cero o una aparición.
.à
Comodín.(Un carácter)
(
)à
Agrupación.
-à
Rango.(Utilizando caracteres ASCII)
Ej.
Localice en el fichero passwd aquellos usuarios cuyo número de expediente
es impar y pertenecen al grupo 109.
Awk
‘^f.....[13579] :.* :109 {print} [etc/passwd]
c. Comparación
de cadenas : Permiten
ejecutar acciones en función de determinados valores del registro
de entrada. Para acceder a partes del registro se definen las variables$1,
$2...$199 que contienen automáticamente el primero, segundo...etc
campo del registro. Los comparadores admitidos son :
~ àIdentificación
: Comprueba si una cadena se ajusta a un patrón.
!~àNo
identificación.
==à
Igualdad.
!=à
Desigualdad.
<,>...à
Comparación.
d. Patrones
compuestos : Se
obtienen combinando patrones simples mediante los operadores :
&&à
AND.
||à
OR
!à
NOT.
e. Patrones
de rango : Se forman
con dos patrones separados por una coma. Awk ejecuta la acción sobre
todos los registros de la entrada situada entre el registro que coincide
con el primer patrón y el que coincida con el segundo.
f. Patrones
BEGIN y END : Son
dos patrones especiales de awk. La acción asociada al patrón
BEGIN se ejecuta antes de leer ninguna línea de la entrada. Se utiliza
para inicializaciones. La acción asociada a END se ejecuta después
de leer el fin de fichero ; se utiliza para presentaciones de resultados.
Ninguno de los dos utiliza un registro en una línea para la acción.
(No se puede hacer referencia a $1, $2 ..en BEGIN o END porque no hay registros
contenidos)
ACCIONES
:
Las acciones
en awk son operaciones en lenguaje C que utilizan los campos del registro
que concuerdan con el patrón.La acción vacía es equivalente
a un print.
Variables
:
Awk utiliza
la misma nomenclatura de variables que C, pero no exige que una variable
esté declarada para poder usarla. Para poder operar con una variable
debe tener un valor. Además
de las variable definidas por el usuario, awk puede acceder a todas las
variables del SHELL situándolas entre comillas.
Awk
también ofrece un conjunto de variables predefinido. Las más
importantes son :
FS àSeparador
de campo.
NF àNúmero
de campos del registro.
NR àNúmero
de registros leídos.
FILENAME àContiene
el fichero de entrada.
ARGV àArray
de argumentos de la llamada a awk.
Asignación
:
-v
nombe = valor
Operadores
:
Permite
operadores sobre caracteres y sobre enteros.
Los
operadores permitidos son entre otros :
1. Aritméticos
: +, -,
*, /, %,^...etc.
2. De
asignación : =,
+=, -=, ^=, %=...etc.
3. Operadores
de comparación : ==,
>, <, >=, <=, !=
4. Funciones
: tan,
sen, cos, log, exp, sqrt, rand...etc.
5. Funciones
sobre cadena : substr,
match, length, split...etc.
6. Operadores
lógicos : &&,
||, !
7. Unión
de dos cadenas : Se
pone una detrás de la otra.
Arrays
:
La
definición de matrices en awk es idéntica a su definición
en UNIX ; Un conjunto de valores que no tienen relación de tipo
se encuentran unidos lógicamente por un elemento base y un conjunto
de índices.
Los
arrays son unidimensionales. Los índices pueden ser cualquiera.
Para
acceder a un elemento de array tanto en asignación como en obtención
de valor se hace uso de la sintaxis de C, que es la misma que la de pascal.
Para
simplificar la gestión de arrays awk ofrece las siguientes estructuras
:
1. delete
<BASE> [<INDICE>]à
Elimina un elemento del array.
2. <subíndice>
in <BASE> à
Es cierto si el subíndice existe.
3. for
<VARIABLE> in <BASE> : Realiza una iteración por índice.
sentencia
Funciones
definidas por el usuario :
La
definición de una función utiliza la sintaxis de C, pero
sin tipo.
Sintaxis
:
function
<nombre> (lista de parámetros)
{lista
de sentencias}
Aquí
no hay tipos, pero puede devolver un valor con la sentencia return. (Si
incluye return es función , sino es procedimiento).
Sentencias
de control :
Las
sentencias de control de flujo son :
1. if
(condicion) sentencia [else][sentencia]
2. while
(condición) sentencia
3. do
(sentencia) while (condición)
4. for
(inicialización ; test ; incremento) sentencia
5. breakà
Fuerza la salida del bucle.
6. exità
finalización de la entrada.
Funciones
de UNIX à
TEMA 5
La
sintaxis de las funciones UNIX es :
function nombre
{
orden
;
orden
; Ordenes
UNIX (Variables con $)
...
orden
;
}
Donde
las ordenes se correspondes con comandos del SHELL. Una vez que se ha definido
una función en un SHELL esta es accesible solo desde ese SHELL.
Los parámetros de esa función se referencian desde dentro
de la misma mediante las pseudo variables $1, $2...etc.
Los
parámetros son iguales que en los guiones.
No
existe la exportación de funciones.
Las
funciones desaparecen cuando desaparece el SHELL.
E/S
en awk :
Entrada
:
Awk
recorre automáticamente la entrada estándar analizando cada
registro y comparándolo con los patrones. En ocasiones es necesario
leer de forma automáticamente alguna línea de la entrada
estándar o de otro fichero. La función getline toma
una línea de la entrada estándar y almacena su valor en una
variable.
Esta
lectura es aparte de la que realiza el awk .Lee de la entrada estándar
una línea y la almacena en una variable.
Salida
:
Para
generar salida awk dispone de las funciones print y printf
las dos escriben en la salida estándar pero printf permite
dar formato a la salida.
Tanto
la entrada como la salida puede redireccionarse a un fichero distinto del
estándar mediante >,>> y < con el fichero entre comillas. El
fichero de terminal se especifica como /dev/tty
Ejemplos
:
1. Dada
una tabla como la siguiente :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Generar
mediante awk un fichero de salida que muestre la misma tabla y calcule
el total anual de cada fruta, el total de ventas por cada mes y el total
general.
Solución :
Necesitamos tres patrones
diferentes :
1º. Patrón
para la cabecera: [^0-9]ó^[
\ t]óNR
==1
2º. Patrón
para el resto: [^0-9]óNR
!=0
3º. Patrón
para la última línea: end
Los cuales tiene sus
respectivas acciones :
1º {print
$0 “\t TOTAL”;// sino se pone acción
asume un print.
for
(i=2 ; i < NF ; i++) // Para inicializar la matriz.
total
[ i ] = 0 ;
}
2º {suma
= 0 ;
for
(i=2 ; i < NF ; i++)
{
suma
= suma + $i
total[
i ] = total[ i ] + $i
}
print
$0“\ t” suma ;
}
3º {suma
= 0 ;
for
(i in total)
{
linea
= linea “\ t” total [ i ] ;
suma
= suma + total [ i ] ;
}
print
linea“\ t” suma ;
}
NOTA : Es bueno poner
“ ; ” después de todas las acciones.
2. Realizar
mediante awk un corrector ortográfico que elimine palabras duplicadas
y consecutivas. Para cada palabra duplicada solicitará confirmación
interactivamente.
<patrón_vacío>
//
acción
{
if
(ant == $1)
{
print
“Palabra “$1 “ duplicada, ¿Eliminar ?” > /dev/tty
getline
resp < /dev/tty ;
if
resp = “ N ”printf (“%s \
n”, ant)
else
printf(“\ n”)
}
for
(i=1 ; i <NF ; i++)
if
($i == $(i+1))
{
print
“Palabra “$1 “ duplicada, ¿Eliminar ?” > /dev/tty
getline
resp < /dev/tty ;
if
resp = “ N ”printf (“%s”,
$i) ;
else
printf(“%s, $i) ;
}
ant
= $NF ;
}
BEGIN{
ant
= “ ”
}
END{
printf
(“%s, $i)
}