lunes, 31 de octubre de 2011

Grep en Windows

Esta tarde hablando con un compañero le pregunté si se podía crear un logger para log4net en el que solo sacase los WARN de una clase. Me comentó que él haría un grep y que eso era una de las razones por las cuales le gustaban más los sistemas tipo Linux/UNIX. Entonces recordé que en windows tambien podemos hacer cosas de este tipo y le comenté que con findstring se podía hacerse. He de reconocer que no suelo pensar en línea de comandos. Hace años que dejé eso (desde que no tengo que editar autoexec.bat y el config.sys para ejecutar según que juegos).

Me gustan las ventanas y no lo niego
Creo que los sistemas de ventanas son muy cómodos, no solo a nivel usuario. Para realizar tareas de administración me gusta tener una ventana donde vea todas las opciones y poder editar. Me resulta infinitamente más cómodo que tener que leerme un fichero de script y esperar que las opciones que necesite y que no estén configuradas vengan en una linea comentada.
Aunque reconozco que para ciertas operaciones por lotes la linea de comandos está muy bien y que debería pensar más en eso de lo que suelo hacer.

Linea de comandos en Windows.
Aunque parezca mentira hay linea de comandos en windows, y a fata de una hay dos: El command (para mi MS-DOS aunque no lo sea) y el Powershell.
Powershell es mucho más pontente que la consola de MS-DOS. Fue desarrollado por Mircrosoft para contentar a los administradores de windows que echaban de menos una linea de comando ponente, como la de UNIX. Se lanzó en el 2003 y actualmente se distribuye con los sistemas operativos, tanto de servidor (Server 2008) como de escritorio (Windows 7).
La nueva política de Microsoft intenta que todos sus productos tengan soporte powershell para que los administradores puedan hacer las mismas operaciones tanto desde ventanas como desde linea de comandos, así que sqlserver trae sus scripts de powershell, exchange server también, etc.
Por ejemplo si instalas el Server Core de Windows 2008 Server, se teiene que hacer todo desde la línea de comandos.

Punto negro de powershell
Powershell tiene una carencia importante: No hay una instruccion equivalente a tail -f en UNIX. Lo más parecido es get-content -wait, pero no funciona todo lo bien que sería necesario. Afortunadamente la comunidad de ususarios han generado herramientas para suplir esta carencia. Esperoemos que los chicos de Redmond añadan soporte oficial en próximas actualizaciones.

Ya está bien de tanto coñazo ¿y lo del grep como va?
Para filtrar lineas de fichero en MS-DOS existe la instrucción findstr y para volcar a un fichero cualquier salida de comando utilizamos > así que para hacer el filtro que necesitaba en el log solo tenía que hacer:
findstr WARN aplicacion.log > logfiltrado.log

En powershell se haría concatenando tres comandos: get-content, select-string y out-file, los comandos en powershell se concatenan con pipes:
get-content aplicacion.log | select-string WARN | out-file logfiltrado.log

3 comentarios:

  1. Y cómo se abre el powershell? Ejecutar > "powershell" ? Es que estoy en el Mac xD

    ResponderEliminar
  2. Actualiza la entrada con los comandos que me acabas de pasar para realizar "greps" en directorios:

    >Get-ChildItem -Recurse -Include *.* | Select-String "text to search for"

    >dir -r -i *.* | Select-String "text to search for"

    ResponderEliminar
  3. Sí, Select-String es el que filtra en el text, pero hay que pasarle los ficheros, que es lo que hace el dir o el get-children antes.

    ResponderEliminar