Mostrar caracteres no imprimibles en un archivo de texto

A veces los archivos de texto contienen caracteres no imprimibles o espacios al final de línea que no siempre se notan claramente.

$ cat contenido.txt
texto 1
texto 2
texto   3

Invocando cat con la opción -A podemos verlos:

$ cat -A contenido.txt
texto 1 ^M$
texto 2^M$
texto^I3^M$
^M$

En este ejemplo podemos, se trata de un archivo en formato DOS por el fin de línea utilizado (^M$), en el cual:

  • la primer línea tiene un espacio luego de 1,
  • la tercera tiene un TAB (^I) entre texto y 3
  • la última es una línea vacía

Basado en:

http://systemadmin.es/2015/03/ver-caracteres-no-imprimibles-con-cat

Anuncios

Ejecutar procesos indicando la prioridad en Windows

Si bien se puede Cambiar la prioridad de un proceso en Windows una vez iniciado, es posible que al lanzarlo desde la línea de comandos querramos indicar su prioridad:

start <prioridad> <comando>

donde <prioridad> es alguno de los siguientes valores:

  • /REALTIME: Tiempo real
  • /HIGH: Alta
  • /ABOVENORMAL: Por encima de lo normal
  • /NORMAL: Normal 😉
  • /BELOWNORMAL: Por debajo de lo normal
  • /LOW: Baja

Ejemplo

start /high /b backup.bat

Se ejecuta el archivo batch con la prioridad alta, sin crear una nueva ventana (/b)

También podés Ejecutar procesos indicando la prioridad en Linux

Cambiar de directorio en la línea de comandos en Linux

Continuamente cambiamos de directorio para ubicarnos donde necesitamos trabajar. El comando cd es uno de los más utilizados en la consola.

Una situación particularmente común es cambiar entre un par de directorios, o bien ir a uno temporalmente para volver a donde estábamos ubicados.

Volver al directorio anterior

Para posicionarnos en el directorio donde nos encontrábamos antes del último cambio:

cd -

Ejemplo 1:

$ cd /var/www
$ cd /tmp
$ cd -
/var/www
Quedamos posicionados en /var/www

$ cd -
/tmp
Quedamos posicionados en /tmp

Si seguimos haciendo cd – volveremos a alternar entre ambos directorios.

Guardar directorio actual y poder volver a él

Sin conocer con precisión el directorio al que queremos acceder, es posible que usemos muchas veces cd hasta alcanzarlo. Es posible guardar nuestra ubicación actual para poder volver rápidamente a ella.

$ cd /tmp
$ pushd /var
/var /tmp
Guardamos la posición actual /tmp y quedamos posicionados en /var

$ cd lib
$ cd mysql
$ popd
/tmp
Quedamos posicionados en /tmp

Si en lugar de popd hubiéramos ejecutado cd -, nos habría posicionado en /var/lib.

 

Obs: Cada vez que se ejecuta pushd, se agrega el directorio actual a una pila. Cada vez que se ejecuta popd, se quita el último directorio de esa pila.

Formas de ejecutar comandos en secuencia

Cuando se desea ejecutar una serie de comandos en cierto orden y consecutivamente, es común ingresar uno y según el resultado obtenido ejecutar o no el siguiente.

Para simplificar esta acción hay varias alternativas según lo que deseemos que suceda según el éxito o fallo del anterior:

1. Ejecutar cada comando sin importar el resultado del anterior

Se separan los comandos por ; (punto y coma) y se ejecutan TODOS.

mkdir temp; tar -cvzf temp/app1.tar.gz app1

Se crea el directorio y luego se genera un tar.gz dentro. Si el directorio existe, el primer comando falla pero no importa.

2. Ejecutar cada comando si el anterior fue exitoso

Se separan los comandos por && (operador Y) y se ejecutan hasta que uno falle.

tar -cvzf backup/docs.tar.gz docs_dir && rm -r docs_dir/

Se crea un tar.gz y solo si esta acción es exitosa, se elimina el directorio.

3. Ejecutar cada comando si el anterior falló

Se separan los comandos por || (operador O) y en este caso se detiene en el primer comando que se se ejecute con éxito.

wget http://server1/data.txt || wget http://server1/data.bkp || date >> failed_data.log

Se intenta obtener data.txt, si no es posible, se intenta con data.bkp. Si también falla, en última instancia se agrega a un log la fecha y hora del (doble) intento fallido.

 

Por supuesto, se pueden hacer combinaciones entre los casos:

mkdir check; cd check; wget http://server1/data.txt || wget http://server1/data.bkp && mv data.txt || date >> failed_data.log
  • Se crea el directorio y se lo accede. Si el directorio existe, el primer comando falla pero sigue la ejecución.
  • Se intenta obtener data.txt. Si esta descarga se completa, se detiene la ejecución de comandos.
  • De lo contrario, se intenta obtener data.bkp. Si esta descarga se completa se renombra el archivo a data.txt. Si esta última acción puede realizarse, se detiene la ejecución de comandos.
  • Si no se pudo descargar data.bkp o bien no se lo pudo renombrar, se agrega a un log la fecha y hora del (doble) intento fallido.

 

Importante: en lo casos mencionados, un comando no utiliza la salida del anterior como su entrada.

Cómo buscar hacia atrás (y hacia adelante) en el historial de Linux

El historial de la consola puede volverse muy grande y recorrerlo línea por línea cuando recordamos parte del comando ejecutado no vale la pena.

Suponiendo que al ingresar el comando history en la consola obtenemos:

1 cat ~/.bashrc
2 ls -la
3 head ~/.bash_history
4 pwd
5 top
6 tail ~/.bash_history

Para realizar un búsqueda hacia atrás en el historial (Reverse I Search) presionamos Ctrl + R y el prompt cambia a:

(reverse-i-search)`':

A medida que escribimos parte del comando que recordamos, se presentará la línea más reciente del historial que coincida con el texto ingresado.

Por ejemplo, si escribimos “bash” veremos:

(reverse-i-search)`bash': tail ~/.bash_history

  • Al presionar Enter, ejecutamos el comando.
  • Al presionar la tecla de flecha izquierda o derecha, editamos antes de ejecutarlo.

Si volvemos a presionar Ctrl + R, seguiremos buscando coincidencias hacia atrás; en nuestro caso si lo hacemos 2 veces obtendríamos:

(reverse-i-search)`bash': cat ~/.bashrc

 

En caso de que deseemos cambiar el sentido de la búsqueda hacia adelante  (Forward I Search) presionamos Ctrl + S y el prompt cambia a:

(i-search)`bash': cat ~/.bashrc

Si volvemos a presionar Ctrl + S, seguiremos buscando coincidencias hacia adelante; en nuestro caso obtendríamos:

(i-search)`bash': head ~/.bash_history

Desactivar XOFF

Da la casualidad que Ctrl + S por defecto sirve para indicar el carácter de control que pausa la transmisión de datos en la consola (XOFF) – y Ctrl + Q para continuarla (XON).

Para desactivar este comportamiento, desde la consola ejecutamos:

$ stty -ixoff

o bien, podemos agregar esta línea al archivo de configuración de la consola (~/.bashrc) así aplica a las futuras sesiones.

Ejecutar un comando sin que quede en el historial de Linux

Todos los comandos que ejecutamos desde la consola, quedan registrados en el archivo de históricos el cual se encuentra por defecto en ~/.bash_history para cada usuario (en bash).

Podemos saber cuál es la ubicación y nombre de este archivo mediante:

$ echo $HISTFILE

Para consultarlo, por lo general se utiliza:

$ history

y se puede limpiar mediante

$ history -c

Después de esta introducción, vamos a punto. Si solo necesitamos invocar un comando y que no quede registro de su ejecución basta con agregar un espacio en blanco delante del comando.

$ <ESPACIO>comando

Ejemplo:

$  /etc/init.d/mysqld restart

OBS: existe un espacio adicional delante de la primer barra /

 

Detalles internos

En realidad, este comportamiento depende de la variable HISTCONTROL. Podemos ver su valor mediante:

$ echo $HISTCONTROL

Los valores soportados son los siguientes (se pueden indicar varios separados por coma):

  • ignorespace: los comandos ingresados que comiencen con un espacio, no se guardan en el histórico
  • ignoredups: los comandos ingresados que coincidan con la última línea del histórico, no se registran
    • si se ingresa varias veces consecutivas el mismo comando (duplicado), solo queda registrado una vez
  • erasedups: los comandos ingresados que coincidan con alguna línea del histórico, se registran y se borra la línea existente previamente
    • si se ingresa varias veces, consecutivas o no, el mismo comando (duplicado) solo se deja registro de la última vez
  • ignoreboth: es lo mismo que “ignorespace,ignoredups”

Invertir el orden de las líneas de un archivo en Linux

Si necesitamos procesar el contenido de un archivo, tomando sus líneas desde la última a la primera (por ejemplo en un archivo de log) podemos programar un script que las lea todas y luego aplique la acción en el orden requerido. Pero si pudiéramos hacerlo desde la consola sería mejor. Y se puede.

Simplemente utilizamos el comando tac (el inverso de cat) el cual concatena cada archivo que se pasa como argumento pero en el orden inverso, línea por línea desde el final del archivo.

Ejemplo:

tac original.log > invertido.log

crea el archivo invertido.log con las líneas en el orden opuesto al que poseen en original.log

 

Tip: No confudamos con tail, el cual imprime las últimas líneas de un archivo pero en el orden original.