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