UNIX Commands and Administration

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

Otros

* 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

Administracion

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 disco1- 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.

Øà Estado de desconexión o máquina desconectada. Diagnosticos de hardaware.

Øà 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).

Øà Multiusuario. Modo normal de operación. INIT por defecto.

Øà Para poder usar el sistema remoto de ficheros. Se puede arrancar directamente o al añadirse los sistemas RFS (Remote File System).

Øà Estado definido por el usuario.

Øà Estado firmware. Para hacer pruebas especiales. Arranque del sistema desde diferentes archivos de arranque.

Øà 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.

Øà 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}.

Backups

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

Administrando un Tape

Mt –f /dev/rmt/0n argumento

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)

Manejando direccionamientos

La shell emplea 4 tipos de redireccionamiento :

< 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

 LA HERRAMIENTA AWK :

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 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 :


 
ENERO
FEBRERO
...
DICIEMBRE
PERAS
10
20
...
7
UVAS
15
7
...
40
...
...
...
...
...
MANZANAS
15
20
...
30

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) 

}