jueves, 20 de octubre de 2016

Creando secuencias con Shell, seq , echo, jot...

seq puede crear secuencias numericas crecientes y decrecientes con diferentes intervalos, la forma mas simple seria:
seq 5
1
2
3
4
5
si queremos la secuencia decreciente
seq 5 1
5
4
3
2
1
si queremos rellenos con ceros
seq -w 5 1
5
4
3
2
1
¡no pasó nada! -- noo, si pasa, pero aqui no hay ceros que rellenar, prueba
seq -w 10 1
o
seq -w 100 1           ó tambien            seq -w 100
y aqui el último numero de la secuencia será 001

ahora los intervalos...
los intervalos standard son de unidad. Si queremos intervalos diferentes tenemos que definir el inicio, intervalo y fin, asi:

seq 1 0.5 10

o decreciente con
seq 10 0.5 1
aha! aqui seq no hace nada y nos dice:
seq: needs negative decrement
que es absolutamente lógico pues le estamos pidiendo a seq que nos haga una secuencia decremental, y seq sólo suma el intervalo, por lo que tenemos que darle a seq un intervalo negativo, asi

seq 10 -0.5 1 si nos funcionará

las opciones -s y -t tambien nos pueden ser muy útiles


seq -s , -t ENDSEQ 10 -0.5 1

10,9.5,9,8.5,8,7.5,7,6.5,6,5.5,5,4.5,4,3.5,3,2.5,2,1.5,1,ENDSEQ

lo que podria servir por ejemplo para rellenar matrices o crear sucesiones.

Y para terminar aun nos queda la opcion -f o "format" que va a definir si los números se presentarán como estandard (%g), exponencial o notacion cientifica(%e), o con punto decimal y 6 posiciones decimales(%f)

prueba seq -f %g con %e y f% y veras estos formatos mas claramente, pero la fuerza de -f no radica exactamente en estos 3 formatos, sino en los formatos adicionales que se pueden crear a traves de estos. Y es que -f tambien puede ser "archivo%02g.txt" o "logfile.%03g" asi

~\> seq -f "logfile.%03g" 5
logfile.001
logfile.002
logfile.003
logfile.004
logfile.005

con lo que podemos usar seq para crear archivos por ejemplo asi:

touch $(seq -f "logfile.%03g" 5)

o para borrarlos, o crear directorios, etc.


SECUENCIAS CON JOT

SECUENCIAS CON ECHO

echo {1..9}
1 2 3 4 5 6 7 8 9

echo {5..1}
 5 4 3 2 1

en este sentido es echo un poco mas poderoso que seq y jot ya que estas secuencias pueden ser tambien alfabeticas, como
echo {a..z}
echo {A..Z}
y reversas:
echo {z..a}      a asi...
pero estas secuencias estaran siempre en la misma linea (a no ser que se acabe la pantalla entonces salta a la siguiente linea), y si quisieramos que los numeros esten uno bajo el otro necesitaremos a xargs asi
echo {1..10} | xargs -n1
cosa que podria parecer molesta depender de un segundo comando para esta opcion, aunque si lo miramos asi
echo {1..9} | xargs -n3
echo {a..y} | xargs -n5
tenemos como resultado unas bonitas matrices

pero la salida de { .. }  la podemos utilizar en Unix de muchas otras maneras mas alla de echo, ya que echo es solo un repetidor que saca cosas por la salida estandar stdout o por otra dirigida con direccionamientos > o pipes

asi podemos directamente crear el efecto de arriba en ~\> seq -f "logfile.%03g" 5
con:
touch logfile.00{1..5} 

crear directorios:
md directorio_{a..z}                 ó sino tambien md              {a..z}_directorio

con XARGS podemos
cambiar derechos de grupos de usuarios en todas las carpetas dentro del directorio listado:


o lo que seria aún mejor, cambiar los derechos de sólo algunos directorios que cumplan con alguna condición como los que comienzen con "a"

ls a* | xargs sudo chgrp wheel

o filtrarlo con find:

find d* -*k-z

No hay comentarios:

Publicar un comentario