Búsqueda de datos
En Linux (y Unix en general), solemos disponer del comando grep para realizar búsquedas en archivos. Esto funciona muy bien cuando los archivos que contienen los datos son de texto plano, lo cual no es el caso para archivos IPM
Por ejemplo, supongamos que en alguno de estos archivos hay compras en un local llamado “Carpinteria”, pero no sabemos en cual de ellos están esas transacciones. Veamos como podemos encontrarlas.
Primero, intentemos utilizar el comando grep del sistema:

Como podemos observar, no obtenemos ningún resultado, y grep nos devuelve el valor 1 indicando que no pudo efectuar búsquedas en archivos “binarios” Podemos, por supuesto, abrir el archivo con un editor hexadecimal y realizar ahí la búsqueda.
Probemos ver si podemos utilizar hexdump desde la linea de comandos:

No parece contener algo que sea fácilmente legible. Pero ¿cual es el problema? Vemos que la codificación es EBCDIC, por lo que si bien podemos ver los valores de los bytes, no contienen una representación visible en ASCII. Claro que podríamos convertirlo primero a ASCII y luego usar hexdump, pero cuando tenemos muchos archivos, eso no es una opción práctica.
Intentemos utilizar otra herramienta, en este caso una herramienta gráfica (ya que en Windows también existen editores en hexadecimal gráficos):

Ahora, al cambiar la codificación a EBCDIC, comenzamos a ver valores que pueden llegar a identificarse. Sin embargo, esta opción requiere ir abriendo uno por uno los archivos para efectuar las búsquedas, y cuando necesitamos encontrar algo más especifico, que no sea solamente una cadena de caracteres, la situación tampoco mejora mucho.
Veamos entonces como podemos utilizar la herramienta para realizar búsquedas en archivos IPM.
Como dijimos anteriormente, comenzamos buscando los archivos que contienen transacciones realizadas en un comercio que contiene la palabra “carpinteria” en su nombre. Sabemos que el nombre del comercio viene en el campo DE043, pero vamos a comenzar haciendo una búsqueda global
Para ello, invocamos la herramienta con el comando GREP, indicando primero el criterio de búsqueda y luego el o los archivos donde efectuar dicha búsqueda.
Respecto al criterio, esto es muy flexible, y podemos hacer búsquedas globales (en cualquier parte del registro), en campos específicos (incluidos subcampos), o incluso combinaciones lógicas en las condiciones como OR y AND (para más información del uso de las condiciones, referirse a la sección correspondiente al comando GREP)
Por el momento busquemos el texto “carpinteria”. Observemos que la busqueda no es case-sensitive

Vemos que en el archivo file9 hay 6 registros que contienen ese texto en el campo DE043. Vemos además los números de registro donde está presente, y vemos también que los 6 registros corresponden a primeras presentaciones.
A partir de aquí podemos centrarnos en mejorar la búsqueda, pero ahora solamente sobre el archivo file9 que es el que contiene nuestra posible transacción buscada.
Por ejemplo, un siguiente paso podría ser que, ademas de mostrarnos los registros donde está el texto que buscamos, nos muestre el contenido de los campos DE004 (Importe de la transacción) y DE012 (Fecha y hora). Para ello podemos agregar el flag -F donde indicamos los campos que queremos mostrar de los registros encontrados, aunque ellos no contengan el valor buscado.
Para indicar los campos, escribimos la lista de campos separados por comas, y podemos indicar si se trata de un Data Element (DE), de un Private Data Subelement (PDS), o de un Subfield de cualquiera de estos. Por ejemplo, la fecha y hora que vienen en el DE012, contiene dos subfields que son, la fecha en el subfield 1, y la hora en el subfield 2. Entonces, en lugar de especificar que queremos el DE12, podemos indicar que queremos el DE12 SF 1 y el DE12 SF 2 por separado.
Para mas información de como especificar los campos y también de como utilizar listas predefinidas, por favor referirse a la sección del comand FILTER o a la sección Flags y Filtros
Veamos la salida de este comando:

Ahora podemos ver los importes y los horarios en que esas transacciones fueron hechas.
Ahora bien, suponiendo que hay muchos registros que contienen el valor que estamos buscando, pero conocemos algún otro dato de la transacción, podemos ir mejorando el criterio de búsqueda. Por ejemplo, sabemos que la transacción fue hecha en el comercio llamado “carpinteria”, y que el valor de la misma fue de 1970.00
Podemos entonces, buscar ese registro específico de la siguiente forma:

Ahora obtenemos como resultado un único registro, el 2339, que contiene la transacción que estamos buscando.
En este punto seguramente vamos a querer ver todos los datos de la transacción en cuestión. Si bien podríamos especificar la lista de campos a desplegar, existen otras formas mas eficientes.
Una forma es utilizando el comando PRINT. Este comando permite mostrar, en forma amigable, los contenidos de un archivo o de los registros especificados.
Podemos redirigir esa salida a un archivo de texto para poder visualizarla posteriormente en un editor de texto.
Vamos a ver el contenido del registro encontrado con el comando GREP utilizado anteriormente. Vimos que el registro era el numero 2339, por lo que podemos indicar que queremos ver solamente ese registro

Por defecto, el comando PRINT nos muestra, para cada registro de salida, la lista de campos presentes en el registro pero no sus valores (primero los DE y luego los PDS presentes).
Si queremos ver los valores de cada campo, agregaremos el flag --detailed (-d)

De esta forma vamos a ver la lista de los campos presentes en el registro, su descripción, y el valor correspondiente.
También podemos agregar la opción --subfields (-s) para ver el contenido de cada uno de los subcampos cuando existan los mismos.

En caso de querer redirigir esa salida a un archivo para ser visto en un editor de texto, es conveniente agregar los flags --silent (-z) o --mono para que la salida se haga sin los caracteres que indican los colores (salida monocromática). En las últimas versiones de la herramienta esto se va a hacer automáticamente al detectar que la salida está siendo redireccionada, pero siempre podemos forzarlo mediante el uso de esos flags.