Viernes, Septiembre 22, 2017

Recuperar sólo la primera coincidencia con grep

linux-archivos

Supongamos que deseamos buscar una cadena en un archivo de texto, pero sólo nos interesa quedarnos con el primer resultado de la búsqueda:

root@linuxito:~# grep server_name /usr/local/nginx/conf/nginx.conf
        server_name linuxito.com;
        server_name www.linuxito.com;
        server_name linuxito.com;
        server_name www.linuxito.com;

Probablemente nos veamos tentados a utilizar head:

root@linuxito:~# grep server_name /usr/local/nginx/conf/nginx.conf | head -n 1
        server_name linuxito.com;

Sin embargo, grep posee una opción para controlar qué cantidad de resultados deseamos visualizar.

Por ejemplo, ¿qué ocurre cuando necesitamos imprimir cada coincidencia junto con líneas adyacentes (cuando se utiliza -B, -A, o ambas)? El resultado sería el siguiente:

root@linuxito:~# grep server_name /usr/local/nginx/conf/nginx.conf -A 1
        server_name linuxito.com;
        return 301 http://www.linuxito.com$request_uri;
--
        server_name www.linuxito.com;
        server_tokens off;
--
        server_name linuxito.com;
        server_tokens off;
--
        server_name www.linuxito.com;
        server_tokens off;

Por supuesto head todavía sirve, aunque hay que ajustar la cantidad de líneas a mostrar:

root@linuxito:~# grep server_name /usr/local/nginx/conf/nginx.conf -A 1 | head -n 2
        server_name linuxito.com;
        return 301 http://www.linuxito.com$request_uri;

No obstante, grep cuenta con la opción -m que permite limitar la cantidad de resultados a mostrar (detener la búsqueda luego de -m coincidencias), lo cual además reduce el tiempo de búsqueda si se trata de archivos de gran tamaño:

root@linuxito:~# grep server_name /usr/local/nginx/conf/nginx.conf -A 1 -m 1
        server_name linuxito.com;
        return 301 http://www.linuxito.com$request_uri;

Esta opción simplifica el procesamiento pues si, en vez de la primera, queremos las primeras N coincidencias, utilizando head habrá que hacer las cuentas, mientras que con -m es tan simple como pasar N como parámetro:

root@linuxito:~# grep server_name /usr/local/nginx/conf/nginx.conf -A 1 | head -n 5
        server_name linuxito.com;
        return 301 http://www.linuxito.com$request_uri;
--
        server_name www.linuxito.com;
        server_tokens off;
root@linuxito:~# grep server_name /usr/local/nginx/conf/nginx.conf -A 1 -m 2
        server_name linuxito.com;
        return 301 http://www.linuxito.com$request_uri;
--
        server_name www.linuxito.com;
        server_tokens off;

En este caso, utilizando head la cantidad de líneas a filtrar es 5 (2 coincidencias de 2 líneas cada una, más la línea de separación), mientras que utilizando -m simplemente es 2.

 

Fuente: linuxito

¿Quién está en línea?

Hay 44 invitados y ningún miembro en línea

Contador de Visitas

8964368
Hoy Hoy 97
Ayer Ayer 1167
Esta semana Esta semana 4879
Este mes Este mes 24234
Total de Visitas Total de Visitas 8964368

Día con más
visitantes

07-19-2017 : 1525

Gracias por su visita