Tutorial de jq para archivos HAR

Dame un tutorial del uso de jq para trabajar con archivos .har
18/3/2026, 6:35:27 p.m.
Asistente
🤔 Pensamiento: Hola, el usuario está pidiendo un tutorial sobre cómo usar jq para trabajar con archivos .har. Esto me indica que probablemente tiene experiencia técnica y necesita manipular archivos de registro HTTP (HAR) para análisis, depuración o extracción de datos. Los archivos HAR son básicamente archivos JSON con una estructura específica que documenta las interacciones de red de un navegador. Voy a planear una respuesta que cubra desde lo más básico hasta casos prácticos. Primero debería explicar qué es un archivo HAR y su estructura, luego la instalación de jq, y después los comandos fundamentales para explorar y filtrar datos. También sería útil incluir ejemplos concretos como extraer URLs, filtrar por tipo de contenido, o convertir a CSV. Los resultados de búsqueda son bastante útiles. La documentación oficial de jq [citation:2] y las notas detalladas [citation:4] me darán la base sólida sobre sintaxis y opciones. Para ejemplos específicos con HAR, el repositorio har2csv [citation:8] es perfecto para mostrar cómo extraer campos a CSV. Las respuestas de Stack Overflow [citation:9] y los ejemplos del gist [citation:10] muestran casos reales de filtrado por cabeceras HTTP y URLs específicas. También hay un ejemplo práctico de Ping Identity [citation:3] sobre cómo procesar logs en formato HAR. La información sobre instalación la puedo obtener de varias fuentes, pero las más confiables son la documentación oficial [citation:2] y las notas académicas [citation:4]. Los comandos básicos como el filtro de identidad `.` y el acceso a objetos `.key` están bien explicados en múltiples fuentes [citation:1][citation:2][citation:4]. Voy a estructurar la respuesta en secciones lógicas: introducción al formato HAR, instalación, exploración básica, filtrado avanzado, y casos prácticos como exportación a CSV y manejo de archivos grandes. Incluiré ejemplos de código en cada sección para que sea práctico y fácil de seguir. La respuesta será en español, manteniendo un tono profesional pero accesible, similar al estilo de tutoriales técnicos.

Te voy a explicar cómo usar jq para trabajar con archivos .har. Un archivo HAR (HTTP Archive) es básicamente un JSON que guarda toda la interacción de red de un navegador, y jq es la herramienta perfecta para analizarlo desde la línea de comandos [citation:5][citation:8].

📚 Entendiendo la estructura de un archivo HAR

Antes de empezar, es útil conocer la estructura básica de un HAR. Todo el contenido está dentro de un objeto log que contiene una clave entries, que es un array con todas las peticiones [citation:8][citation:9]:

{
  "log": {
    "entries": [
      {
        "request": { ... },
        "response": { ... },
        "timings": { ... },
        "startedDateTime": "...",
        "time": ...
      },
      ...
    ]
  }
}

🔧 Instalación de jq

En Linux

# Debian/Ubuntu
sudo apt-get install jq

# CentOS/RHEL
sudo yum install jq

# O desde fuente
git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure
make
sudo make install

[citation:1]

En macOS

brew install jq

[citation:8]

En Windows

Puedes descargar el ejecutable desde la página oficial de jq [citation:3].

🚀 Operaciones básicas con jq en archivos HAR

1. Visualizar y validar el HAR

El filtro más simple es ., que muestra el JSON formateado y valida su estructura [citation:2][citation:4]:

cat archivo.har | jq '.'

2. Obtener todas las URLs de las peticiones

cat archivo.har | jq '.log.entries[].request.url'

[citation:9]

Para obtenerlas sin comillas (formato raw):

cat archivo.har | jq -r '.log.entries[].request.url'

[citation:2]

3. Ver métodos HTTP y URLs

cat archivo.har | jq '.log.entries[] | {method: .request.method, url: .request.url}'

🔍 Filtrado y selección avanzada

Filtrar por método HTTP

# Solo peticiones POST
cat archivo.har | jq '.log.entries[] | select(.request.method == "POST") | .request.url'

# Solo peticiones a una API específica
cat archivo.har | jq '.log.entries[] | select(.request.url | contains("/api/")) | .request.url'

Filtrar por código de respuesta

# Peticiones con error 404
cat archivo.har | jq '.log.entries[] | select(.response.status == 404) | {url: .request.url, status: .response.status}'

Filtrar por tipo de contenido

# Solo respuestas JSON
cat archivo.har | jq '.log.entries[] | select(.response.content.mimeType | contains("application/json")) | .request.url'

[citation:10]

Filtrar usando expresiones regulares

# URLs que contengan un patrón específico
REQUEST_URI="facebook.com/api"
cat archivo.har | jq -r '.log.entries[] | select(.request.url | test("'$REQUEST_URI'")) | .request.url'

[citation:10]

📊 Extracción de información específica

Extraer cabeceras HTTP específicas

Para obtener URLs junto con cabeceras específicas (Content-Type y Content-Encoding):

cat archivo.har | jq '.log.entries[] | {
  url: .request.url,
  content_type: (.response.headers[] | select(.name == "Content-Type") | .value // ""),
  content_encoding: (.response.headers[] | select(.name == "Content-Encoding") | .value // "")
}'

[citation:9]

Extraer tiempos de carga

cat archivo.har | jq '.log.entries[] | {
  url: .request.url,
  tiempo_total: .time,
  espera: .timings.wait,
  recepcion: .timings.receive
}'

Extraer contenido de respuestas JSON

# Extraer el cuerpo de respuestas JSON (útil para APIs)
cat archivo.har | jq -r '.log.entries[] | select(.response.content.mimeType | contains("json")) | .response.content.text | fromjson'

[citation:10]

📈 Exportación a otros formatos

Convertir a CSV

Puedes generar un CSV con las columnas que necesites [citation:9]:

cat archivo.har | jq -r '["URL", "Status", "Content-Type"], (.log.entries[] | [
  .request.url,
  .response.status,
  ((.response.headers[] | select(.name == "Content-Type") | .value) // "")
]) | @csv' > salida.csv

Usando har2csv

Existe un script especializado llamado har2csv que simplifica esta tarea [citation:8]:

# Descargar el script
wget https://raw.githubusercontent.com/Nooshu/har2csv/main/har2csv.jq
chmod +x har2csv.jq

# Ejecutar
./har2csv.jq archivo.har > salida.csv

⚡ Técnicas avanzadas

Combinar múltiples archivos HAR

Si tienes varios archivos HAR y quieres combinarlos en uno solo [citation:3]:

jq -s '{
  log: {
    version: .[0].log.version,
    creator: .[0].log.creator,
    entries: (reduce .[] as $entry ([]; . + $entry.log.entries))
  }
}' archivo1.har archivo2.har > combinado.har

Procesar archivos HAR muy grandes

Para archivos HAR enormes, usa el modo streaming para no cargar todo en memoria [citation:2][citation:7]:

jq --stream 'select(.[0][0] == "log" and .[0][1] == "entries") | .[1]' archivo_grande.har

Estadísticas básicas

# Número total de peticiones
cat archivo.har | jq '.log.entries | length'

# Peticiones por código de respuesta
cat archivo.har | jq '.log.entries | group_by(.response.status) | map({status: .[0].response.status, count: length})'

# Tiempo medio de respuesta
cat archivo.har | jq '[.log.entries[].time] | add / length'

💡 Consejos útiles

  1. Siempre entre comillas simples: En Unix/Linux, usa 'filtro' para evitar que el shell interprete caracteres especiales [citation:2].

  2. Formato raw con -r: Úsalo cuando quieras strings sin comillas, ideal para guardar en archivos [citation:2][citation:4].

  3. Compacto con -c: Si prefieres cada objeto en una línea (útil para procesamiento posterior) [citation:2].

  4. El operador //: Es muy útil para valores por defecto cuando una clave no existe: .algoQuePodriaNoExistir // "valor_por_defecto" [citation:9].

¿Tienes algún objetivo específico con tu archivo HAR? Puedo ayudarte a construir el filtro exacto que necesitas.

18/3/2026, 6:35:27 p.m.
para un determinado array dentro del archivo har, cómo puedo ver sólo los elementos de ese array? sin mostrar todos el contenido de sus elementos
18/3/2026, 6:44:38 p.m.
Asistente
🤔 Pensamiento: ¡Claro! Entiendo que quieres ver solo los elementos de un array específico dentro de un archivo HAR, pero sin mostrar todo el contenido detallado de cada elemento, quizás solo sus índices o una vista resumida. Te explicaré cómo hacerlo con jq. Primero, recordemos la estructura típica de un HAR. El array principal de entradas está en `.log.entries`. Pero puede haber otros arrays, como `.log.pages` o dentro de cada entrada hay arrays de cabeceras, cookies, etc. Para "ver sólo los elementos de ese array" sin mostrar todo el contenido, tienes varias opciones: 1. **Mostrar los índices del array** (número de elementos y quizás un resumen). 2. **Mostrar solo algunas propiedades clave** de cada elemento. 3. **Mostrar los elementos en una forma compacta** (por ejemplo, una línea por elemento con campos seleccionados). Depende de lo que entiendas por "ver sólo los elementos". Te daré ejemplos para el array `entries`, pero aplica a cualquier array. ## Mostrar solo el número de elementos ```bash jq '.log.entries | length' archivo.har ``` Esto te da un número, como `150`. ## Mostrar solo las claves/índices del array (si es un array de objetos, puedes listar las keys comunes) ```bash jq '.log.entries | map(keys) | unique' archivo.har ``` Esto te muestra todas las keys que aparecen en los objetos del array, pero puede ser mucha información. ## Mostrar un resumen de cada elemento con campos específicos Por ejemplo, para cada entrada, mostrar solo la URL y el método: ```bash jq '.log.entries[] | {url: .request.url, method: .request.method}' archivo.har ``` Esto devuelve un array de objetos con solo esos dos campos. Si quieres una salida más compacta, en una línea por elemento: ```bash jq -r '.log.entries[] | "\(.request.method) \(.request.url)"' archivo.har ``` ## Mostrar solo los primeros N elementos Para no saturar la pantalla: ```bash jq '.log.entries[:5]' archivo.har # primeros 5 jq '.log.entries[-5:]' archivo.har # últimos 5 ``` ## Mostrar los elementos pero en formato compacto (una línea por objeto) ```bash jq -c '.log.entries[]' archivo.har ``` Esto muestra cada objeto completo pero en una sola línea, sin formato bonito. Puede ser útil para procesar después. ## Mostrar solo los índices numéricos y algún identificador Por ejemplo, si cada entrada tiene un campo `startedDateTime`, podrías hacer: ```bash jq '.log.entries | to_entries[] | {index: .key, time: .value.startedDateTime}' archivo.har ``` Esto te da el índice (0,1,2...) y la fecha/hora de inicio. ## Para un array diferente, por ejemplo, las cabeceras de una respuesta específica Supongamos que quieres ver las cabeceras de la primera entrada: ```bash jq '.log.entries[0].response.headers | length' archivo.har # número de cabeceras jq '.log.entries[0].response.headers[] | .name' archivo.har # solo nombres jq '.log.entries[0].response.headers[] | {name: .name, value: .value}' archivo.har # nombre y valor ``` En resumen, la idea es que después de seleccionar el array, apliques filtros para quedarte con la información que te interesa de cada elemento. Usa `| length` para contar, `| .[]` para iterar, y selecciona campos con `{campo: .campo}`. Si nos dices exactamente qué array quieres examinar y qué información consideras relevante "ver", puedo afinar más la respuesta.
18/3/2026, 6:44:38 p.m.
si ésto, '.log.entries[].response.content.text', es un texto que contiene json, cómo se extrae el JSON? Parece que tiene carácteres de formato, como \n
18/3/2026, 6:51:01 p.m.
Asistente
🤔 Pensamiento: ¡Claro! Vamos a resolver tu duda específica. Cuando tienes un campo como `.log.entries[].response.content.text` que contiene una cadena JSON (con caracteres de escape como `\n`), necesitas parsear esa cadena para convertirla en un objeto JSON y luego navegar por él. En `jq`, puedes usar la función `fromjson` para convertir una cadena JSON válida en un objeto/array de jq. Además, mencionaste que quieres ver "sólo los elementos de ese array" sin mostrar todo el contenido. Supongo que te refieres a que dentro de `response.content.text` hay un array JSON y quieres ver sus elementos. Vamos a ver cómo hacerlo. ## Extraer JSON de un campo de texto Supongamos que tienes un archivo HAR y quieres procesar el contenido de las respuestas que son JSON. El campo `text` contiene el cuerpo de la respuesta como una cadena, a menudo con caracteres de escape. Para convertirlo a JSON y luego acceder a sus elementos, puedes hacer: ```bash cat archivo.har | jq '.log.entries[].response.content | select(.mimeType == "application/json") | .text | fromjson' ``` Esto te dará el objeto JSON completo. Pero si ese objeto es un array y quieres ver sus elementos individualmente (cada elemento en una línea), puedes añadir `[]` para iterar sobre el array: ```bash cat archivo.har | jq '.log.entries[].response.content | select(.mimeType == "application/json") | .text | fromjson | .[]' ``` Si el JSON no es un array sino un objeto, y quieres ver sus claves o valores, puedes usar `keys` o `.algo`. ## Manejo de errores A veces el campo `text` puede no ser JSON válido o puede estar vacío. Para evitar errores, puedes usar `try`: ```bash cat archivo.har | jq '.log.entries[].response.content | select(.mimeType == "application/json") | .text | try fromjson catch null' ``` ## Ejemplo práctico Imagina que en tu HAR tienes respuestas JSON que son arrays de objetos. Quieres ver cada objeto del array. Podrías hacer: ```bash jq -r '.log.entries[] | select(.response.content.mimeType == "application/json") | .response.content.text | fromjson | .[]' archivo.har ``` Si además quieres incluir información de la petición (por ejemplo, la URL) junto con cada elemento del array, puedes combinar: ```bash jq -r '.log.entries[] | select(.response.content.mimeType == "application/json") | {url: .request.url, data: (.response.content.text | fromjson)} | .data[] as $item | {url: .url, item: $item}' archivo.har ``` Pero eso ya es más complejo. ## Mostrar solo los elementos del array sin el contenedor Si el JSON es un array y quieres ver cada elemento por separado (por ejemplo, para procesarlos luego con otras herramientas), la construcción `fromjson | .[]` es la adecuada. ## Nota sobre caracteres de escape El hecho de que veas `\n` en el texto es normal, ya que es una cadena JSON con escapes. `fromjson` los interpretará correctamente. ## Si quieres ver solo los primeros N elementos Puedes usar `limit(n; ...)` o `.[:n]` después de convertir a array: ```bash jq '.log.entries[].response.content | select(.mimeType=="application/json") | .text | fromjson | .[:5]' archivo.har ``` Esto tomaría los primeros 5 elementos si es un array. ¿Es esto lo que necesitas? Si puedes dar un ejemplo más concreto de la estructura de tu HAR y qué parte del array quieres ver, puedo ajustar la respuesta.

Cuando tienes un campo como .log.entries[].response.content.text que contiene una cadena JSON (con caracteres escapados como \n), puedes convertirlo a un objeto JSON real usando la función fromjson de jq. Luego, si ese JSON es un array y quieres ver sus elementos individualmente (sin el contenedor), puedes usar .[] para iterar sobre él.

Extraer y mostrar elementos de un array JSON interno

jq '.log.entries[].response.content | select(.mimeType == "application/json") | .text | fromjson | .[]' archivo.har

Explicación:

  • .log.entries[].response.content selecciona cada contenido de respuesta.
  • select(.mimeType == "application/json") filtra solo los que son JSON.
  • .text obtiene la cadena JSON (con escapes).
  • fromjson la convierte en un objeto/array de jq.
  • .[] despliega cada elemento del array por separado (si el JSON es un array).

Si quieres ver los elementos con un formato más legible, puedes agregar -r para output raw (sin comillas) o -C para color.

Ver solo los elementos (sin claves adicionales)

Si el JSON interno es un array de objetos y solo quieres ver cada objeto, el comando anterior ya te dará cada objeto en una línea (o en formato pretty si usas jq sin -c). Si prefieres cada objeto en una línea compacta (para procesar con otras herramientas), añade -c:

jq -c '.log.entries[].response.content | select(.mimeType == "application/json") | .text | fromjson | .[]' archivo.har

Si el JSON interno no es un array sino un objeto

Si quieres ver solo las claves o valores del objeto, puedes hacer:

  • Ver las claves: fromjson | keys
  • Ver los valores: fromjson | .[] (si es un objeto, .[] devuelve sus valores)
  • Ver un campo específico: fromjson | .campo

Manejo de posibles errores (texto no JSON o vacío)

jq '.log.entries[].response.content | select(.mimeType == "application/json") | .text | try fromjson catch "Error" | .[]?' archivo.har

El ? después de .[] suprime errores si el resultado no es un array.

Ejemplo concreto

Supón que en tu HAR tienes una respuesta JSON como:

{
  "text": "[{\"id\":1,\"nombre\":\"Ejemplo\"},{\"id\":2,\"nombre\":\"Otro\"}]"
}

El comando:

jq '.log.entries[].response.content | select(.mimeType=="application/json") | .text | fromjson | .[]' archivo.har

producirá:

{
  "id": 1,
  "nombre": "Ejemplo"
}
{
  "id": 2,
  "nombre": "Otro"
}

¿Es esto lo que buscabas? Si necesitas extraer solo una parte específica de esos elementos o filtrarlos, puedo ayudarte a ajustar el filtro.

18/3/2026, 6:51:01 p.m.