Dividir ficheros en Linux: split

split es uno de los comandos más útiles que encontré para trabajar con ficheros de texto bajo sistemas GNU/Linux, en cuanto a división se refiere, claro está. Hace justamente lo que se pretende, parte un fichero en partes del tamaño que le digas, permitiendo así manejarlo mejor.
Como ya mencioné, yo lo uso habitualmente y como es rara la vez que me acuerde de cómo funciona, y tengo que recurrir al man, pues decidí crear una pequeña entrada, que siempre puede resultarle de utilidad a más gente.
El funcionamiento es muy sencillo:

shell> split -b size file file_new-
dónde size es el tamaño de cada partición, file es el fichero original y file_new- el fichero resultante, sobre el que pondrá la terminación aa, ab,ac, etc.
Si nos interesa partirlo, por ejemplo en Megas, la forma más simple es indicárselo:
shell> split -b 50m file file_new-
Os dejo a continuación un trozo del manual para ampliar conocimientos:
  • -a, --suffix-length=N
    Usa un sufijo de longitud "n". Por defecto 2.
  • -b, --bytes=SIZE
    Tamaño del fichero de salida. Si va seguido de una k, serán KB, si es de una m, MB.
  • -d, --numeric-suffixes
    Usa un sufijo numérico en vez de alfabético.
  • -l, --lines=NUMBER
    Número de líneas en el fichero de salida.
Más información: http://linux.die.net/man/1/split
Leer más

SysMagic: r s f e i u b

r s f e i u b, representa la secuencia de teclado que permite enviar señales al kernel de Linux cuando éste está completamente colgado, para interactuar con la máquina.
Para aquellas personas que andamos habitualmente con ordenadores gobernados por GNU/Linux es más que probable que alguna vez se nos haya quedado colgado todo el sistema y no tengamos manera alguno de poder acceder al mismo para saber que pasó. La solución es reiniciar, aunque ello puede tener como consecuencia la pérdida de datos, corrupción de discos, etc. Para evitarlo, el kernel tiene un mecanismo muy bueno que permite incluso en situaciones críticas establecer comunicación e interactuar con él. Es lo que se conoce como sysrq. No son más que una combinación de teclas que hacen ciertas tareas y que pueden ayudar en casos de necesidad extrema.
Por defecto está habilitado en el kernel si el contenido del fichero /proc/sys/kernel/sysrq es 1.
shell> cat /proc/sys/kernel/sysrq
1
Si esto es así, tenemos ahora dos formas de interactuar con el sistema, según estemos en local o en remoto. Si estamos en local podemos presionar las teclas Alt + Impr + Opción, mientras que si estamos en remoto, la solución es mandarle datos a la variable representada por el fichero: /proc/sysrq-trigger, tal que así:
shell> echo opción > /proc/sysrq-trigger
Donde las opciones más comúnmente usadas son:
  • s, sincroniza los discos duros.
  • e, manda señal SIGTERM (15) a todos los procesos menos a init.
  • i, manda señal KILL (9) a todos los procesos menos a init.
  • f, manda señal oom_kill para detener los procesos que están consumiendo excesiva cantidad de memoria RAM.
  • u, desmontamos los discos duros.
  • w, muestra las tareas que están bloqueadas y no se pueden detener.
  • t, muestra todas las tareas que se están ejecutando y información de ellas.
  • h, apaga la máquina.
  • b, reinicia la máquina.
  • r, pone el teclado en modo Raw. Suele emplearse para tener acceso al teclado en caso de, por ejemplo, las X han bloqueado el sistema.
Más información en: kernel.org
Leer más

awk: getline + system

Ayer estuve ayudando a una compañera a desarrollar un pequeño script que hiciera algo útil para administración de sistemas Linux. Las condiciones que se ponían era que tenía que usar awk con getline y system. Puesto que nunca hasta ese momento usé tales cosas, me pareció interesante. Hoy voy a comentar aquí, para todos aquellos a los que le haga falta lo que se hizo.
El script que nos propusimos hacer Pepe (Doval) y yo era algo muy simple: Contar la cantidad de ficheros que cada usuario del sistema tenía en una carpeta. Dicha carpeta era introducida como parámetro al script. A priori algo muy sencillo que se podría escribir en bash de manera muy simple.
for i in `awk 'BEGIN{FS=":"} {print $1}' /etc/passwd`
do
   echo -n -e "user: $i.\tFicheros: "
   find $1 -type f -user $i | wc -l
done
El detalle es que así no cumplíamos los requisitos propuestos, que no eran otros que usar las funciones getline y system. Comenzamos por lo tanto a intentar crear un script que lo hiciese. La primera aproximación fue la siguiente:
#/bin/bash
awk -v raiz=$1 'BEGIN { FS=":"
   if(system("test -d "raiz)!=0)
      print ("No existe el directorio");
   else
   {
      while (getline < "/etc/passwd" != 0)
      {
         system( "find "raiz" -user "$1" | wc -l" | getline aa
         print "El usuario " $1 " tiene "aa" ficheros en " raiz;
      }
   }
}'
Puesto que el comando find sí se podía usar, lo aprovechamos (flag -user) y con ello hacemos lo que se nos pide de forma muy sencilla. El problema de esta solución es que la línea del segundo system, la que realiza el find, no funciona, puesto que el paso de parámetros así en awk no es válido.
La solución final por que se se optó no fue otra que hacer el script directamente en awk. Así evitaríamos el paso intermedio de enlace entre bash y awk. Desde luego, una solución más limpia.
El resultado final, tendría por ejemplo el siguiente aspecto:
BEGIN { FS=":"
   print "Introduce el directorio a evaluar"
   getline dir < "-"
   if(system("test -d "dir) != 0)
      print ("No existe el directorio");
   else
   {
      while ((getline < "/etc/passwd") != 0)
      {
         cmd = sprintf("find %s -type f -user %s | wc -l",dir,$1);
         cmd | getline line
         if(line != 0)
            print "El usuario "$1" tiene "line" ficheros en "dir"."
      }
   }
}
Acepto que no es eficiente ni queda bonito el código, pero hace lo que tiene que hacer. Un ejemplo de salida:
shell> awk -f prueba.awk
Introduce el directorio a evaluar
/home
El usuario javier tiene 8297 ficheros en /home.
El usuario user tiene 7949 ficheros en /home.
El usuario root tiene 3 ficheros en /home.
El usuario www-data tiene 4 ficheros en /home.
Leer más

Memoria para el concurso de SL

Tras la finalización de mi PFC sobre Pupppet decidí sacarle un poco más de partido y me presenté al concurso de software libre con él. La idea no era ganarlo, ni de lejos, sino dar a conocer las ventajas que tiene el software de meta-administración y sobre todo en el ámbito universitario.
Os colgaré aquí la memoria que presenté para el concurso y que intenta resumir, en muy poco espacio, todo el trabajo que se ha realizado para el proyecto, pero que en realidad será el que evalúen. Puesto que considero que el objetivo no es el concurso, sino que la gente de sistemas pueda cambiar el chip y empezar a usar estas herramientas, pues entre otras muchas facilidades, está la de mantener las configuraciones de todos los equipos en el mismo estado. Y eso, para los administradores de sistemas es lo más importante.
Por cierto, si te animas a probarlo, deja un comentario :-)
Leer más

LaTeX, notas de advertencia

Para finalizar el tema de los estilos en LaTeX y antes de profundizar algo más en como se hizo la plantilla, que eso será en otro post, a continuación se va a mostrar el código necesario para crear el estilo de advertencia. Como es lógico suponer, se empleará en aquellos casos que se desee destacar algo o algún error. La imagen empleada es la que va a continuación (error.png) y el código LaTeX necesario para crear dicho estilo es el que sigue.
warning error
error.png
\newenvironment{advertencia} [1] {
\tikzstyle{mybox} = [draw=red!75, fill=blue!35, very thick,
   rectangle, rounded corners, inner sep=15pt, inner ysep=15pt]
\tikzstyle{fancytitle} = [fill=red, text=white]
\begin{center}
\begin{tikzpicture}
\node [mybox] (box){%
   \begin{minipage}[c]{0.2cm}
   \centering
\ 
   \end{minipage}
   \begin{minipage}[c]{12cm}
#1
   \end{minipage}
};
\node[fancytitle, left=20pt, rounded corners] at (box.north east) {\ \ Advertencia\ \ };
\node[fancytitle, rounded corners] at (box.west) {\includegraphics[width=0.8cm]{./imagen/error.png}};
\end{tikzpicture}%

\end{center}
}
Y la forma de usar este nuevo estilo, al igual que en el empleo de las notas,
\begin{advertencia}
   {Nota de advertencia}
\end{advertencia}
El resultado final es el que se puede ver a continuación.
LaTeX, nota de advertencia

Relacionado:
Leer más

LaTeX, notas

Hoy ya comenzamos con las partes más complicadas del tema de notaciones en LaTeX. Vamos a crear un estilo ya más personalizado y útil, con un fondo y una imagen que enmarquen un texto. Este estilo se empleó para marcar aquellas notas importantes durante el transcurso de la documentación y que clarificaban partes o puntos un poco más confusos. Como su propio nombre indican, es una nota destacada.
Este post y el siguiente muestran todo el potencial de LaTeX en comparación con Office u OpenOffice. Como podéis ir observando, el código necesario para generar esto es muy poco y una vez escrito su reutilización se hace inmediata. Crear esto en Office puede ser muy costoso, en caso de que se de hecho.
El empleo de un nuevo entorno, hace su posterior uso muy simple.
knotes.png
\newenvironment{nota} [1] {
\tikzstyle{mybox} = [draw=red!75, fill=yellow!5, very thick,
    rectangle, rounded corners, inner sep=15pt, inner ysep=15pt]
\tikzstyle{fancytitle} =[fill=red, text=white]
\begin{center}
\begin{tikzpicture}
\node [mybox] (box){%
     \begin{minipage}[c]{0.2cm}
 \centering
\
     \end{minipage}
    \begin{minipage}[c]{12cm}
#1
    \end{minipage}
};
\node[fancytitle, left=20pt, rounded corners] at (box.north east) {\ \ Nota\ \ };
\node[fancytitle, rounded corners] at (box.west) {\includegraphics[width=0.8cm]{./imagen/knotes.png}};
\end{tikzpicture}%
\end{center}
}
Y como veis, para poder emplearlo nos llega con,
\begin{nota}
     {Nota destacada}
\end{nota}
El resultado final,
LaTeX, nota destacada
Relacionado:
Leer más

LaTeX, configuración destacada

En la serie de post sobre código LaTex, hoy os dejo ya disponible el código LaTeX que genera el estilo que se usó para las partes importantes de configuración de los servicios de Puppet.



\lstdefinestyle{no_fileconf} {
    numbers=none,
    xleftmargin=\parindent,
    xrightmargin=\parindent,
    aboveskip=3mm,
    belowskip=0.01mm,
    basicstyle=\footnotesize\ttfamily,
    backgroundcolor=\color{blue!9},
}
Su forma de uso, al igual que las anteriores es simple, tal como se describe a continuación:
\begin{lstlisting}[style=no_fileconf]
[main]
    autosign = false
\end{lstlisting}
\begin{center}
  \vspace{-0.35cm}
  {\scriptsize\sffamily Ejemplo de dato importante}
\end{center}
Relacionado:
Leer más

LaTeX, comandos del sistema

Continuando con el orden marcado, hoy queda ya disponible el código necesario para enmarcar los comandos del sistema, es decir, las líneas en bash que se ejecutan. Espero que os pueda ser de utilidad.


\lstdefinestyle{consola} {
    numbers=none,
    xleftmargin=\parindent,
    xrightmargin=\parindent,
    aboveskip=3mm,
    belowskip=0.01mm,
    basicstyle=\scriptsize\bf\ttfamily,
    backgroundcolor=\color{black!30},
}
Nuevamente para emplearlo, tal que así,
\begin{lstlisting}[style=consola]
root@xenserver:~/$ cat /etc/mailname
\end{lstlisting}
\begin{center}
  \vspace{-0.35cm}
  {\scriptsize\sffamily Ejemplo de ejecución en consola}
\end{center}
Relacionado:
Leer más

LaTeX, source code

Puesto que lo prometido es deuda, en una serie de post os voy a ir dejando todo el material necesario para que veáis cómo crear los diferentes estilos en LaTeX que empleé en la documentación de mi PFC. Aunque lógicamente cada uno tendrá que adaptarlo a lo suyo, espero sea una buena base para comenzar.
Hoy, vamos a ver el código que define el marco que engloba un trozo de código fuente. Una de las partes más importantes a la hora de mostrar un trozo de código fuente es sin duda la numeración de las líneas, por si tenéis que hacer referencia a una parte concreta.
\lstdefinestyle{fileconf} {
   xleftmargin=\parindent,
   xrightmargin=\parindent,
   aboveskip=3mm,
   belowskip=0.01mm,
   basicstyle=\footnotesize\ttfamily,
   backgroundcolor=\color{black!6},
}
A la hora de usarlo, únicamente,
\begin{lstlisting}[style=fileconf]
#include 
int main(int argc, char* argv[]) {
   puts("Hola mundo!");
}
\end{lstlisting}
\begin{center}
  \vspace{-0.35cm}
  {\scriptsize\sffamily Ejemplo de código fuente}
\end{center}
Relacionado:
Leer más

LaTeX, documentando un PFC

En mi proyecto fin de carrera de la Ingeniería Técnica Informática hice un amplio estudio sobre lo que por aquellas era una tecnología emergente y que prometía, la virtualización. Y más concretamente sobre Xen.
Por aquel entonces, por los apuros con la documentación y estar cursando en paralelo la superior, opté por realizarla en OpenOffice y, aunque desde mi punto de vista para documentos pequeños va genial, para documentos grandes quizás se queda algo corto. Con corto me refiero a que manejar un documento de 150 páginas, con texto e imágenes todo se movía muy lento y tuve muchos problemas para conseguir un resultado final bueno.
Para el PFC de la Superior decidí no cometer el mismo error, así que opté por emplear LaTeX como lenguaje de documentación. Durante toda la documentación sobre Puppet, estuve aprendiendo también en paralelo una gran cantidad de cosas de LaTeX y la verdad, la calidad de la documentación fue inigualable. Gracias a ello, conseguí una mención especial del tribunal sobre dicha documentación.
Puesto que iba a emplear LaTeX, una de las cosas que más me interesaba era tener el mismo aspecto en todos los lugares de la documentación. Por suerte, LaTeX soporta estilos, por lo que eso facilitó enormemente la labor de crear documentación. No tanto el trabajo de hacerlos. Los estilos más destacados los comento a continuación,
En posteriores entradas iré mostrando el código necesario para crearlos y que si os hace falta podréis modificar a vuestro gusto. El capítulo iniciar de la documentación, el que hace referencia a las notaciones empleadas, tiene la siguiente pinta.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios