2 votos

¿Cómo habilitar el color en GNU grep?

Mi GNU grep en Mac no resaltará el texto coincidente con colores (ver ACTUALIZACIÓN, GREP_OPTIONS no funciona):

introducir la descripción de la imagen aquí

mientras que bajo Linux todo funciona directamente:

introducir la descripción de la imagen aquí

y mi configuración en Mac es (casi) la misma que en Linux, incluso con una versión más reciente de grep:

$ env | grep GREP | wc
      0       0       0

$ type grep
grep is hashed (/opt/local/libexec/gnubin/grep)

$ grep -V | head -1
grep (GNU grep) 3.11

$ sw_vers
ProductName:            macOS
ProductVersion:         14.4.1
BuildVersion:           23E224

ACTUALIZACIÓN:

Gracias por tu aporte Allan, de alguna manera GREP_OPTIONS no está funcionando para mí:

introducir la descripción de la imagen aquí

esto es en iterm2, y lo siguiente es en xterm:

introducir la descripción de la imagen aquí

¿Por qué GREP_OPTIONS no está funcionando? Desde el manual en mi Mac:

ENTORNO
GREP_OPTIONS Se puede utilizar para especificar opciones predeterminadas que se colocarán al principio de la lista de argumentos.

5voto

Douglas Puntos 10417

Con la versión BSD de grep, necesitas especificar la opción de color si deseas una salida en color:

grep --color=always

Salida:

introduce aquí la descripción de la imagen

Sin embargo, escribir esa opción para cada instancia de grep puede volverse bastante tedioso bastante rápidamente. Por lo tanto, deberías considerar hacer de grep un alias del comando con la opción de color especificada o especificarla en la variable ambiental GREP_OPTIONS (mi método preferido).

Alias:

alias grep="grep --color=always"

Variable de Entorno

export GREP_OPTIONS='--color=always'

introduce aquí la descripción de la imagen

Puedes añadir cualquiera de las líneas a .zshrc o .zprofile. Si por casualidad estás usando Bash, sería en .bashrc o .bash_profile

Instalé ggrep (GNU grep) con fines de prueba. Encontré lo siguiente:

  • según la página de manual (man ggrep) la variable de entorno GREP_OPTIONS no se usa.

  • la opción de línea de comandos --color=always funciona como se esperaba

    introduce aquí la descripción de la imagen

  • Para hacerlo permanente, tienes que usar la función de alias.

  • Esto funciona en las consolas Zsh y Bash

    introduce aquí la descripción de la imagen

1voto

David Anderson Puntos 2189

Una posible razón para el comportamiento diferente podría ser que tengas un alias de grep definido en Linux y no en macOS. Una solución bajo macOS sería agregar un alias de grep. Otra solución sería agregar un script corto llamado grep a /usr/local/bin. Las explicaciones se dan a continuación.


Instalé Ubuntu 24.04 LTS (Linux) en una máquina virtual. Cuando se crea una nueva cuenta de usuario, la carpeta de inicio incluye un archivo ~/.bashrc por defecto. Las siguientes líneas están incluidas en este archivo.

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'

Dado que la shell por defecto es bash para Ubuntu, la salida de los comandos a continuación produce abc con la letra b en rojo. Esto sucede porque grep está aliased a grep --color=auto.

echo abc | grep b

A continuación se muestra la salida de ejemplo de una ventana de Terminal de Ubuntu, donde la shell es bash.

Ubuntu no tiene zsh por defecto. Lo instalé ingresando lo siguiente.

apt install zsh

Después de ingresar el comando zsh por primera vez, se me pidió que llenara mi archivo ~/.zshrc con la configuración recomendada por el administrador del sistema. Este archivo ~/.zshrc no contiene aliases. Después de ingresar el comando zsh, ingresé nuevamente lo siguiente.

echo abc | grep b

A continuación se muestra la salida de ejemplo de una ventana de Terminal de Ubuntu, donde la shell es zsh.

Esta vez, la letra b no estaba en rojo. Por lo tanto, el comportamiento es el mismo que en macOS al usar zsh, que es la shell por defecto para macOS.


Variables de Entorno

El comando info grep a menudo produce más detalles que la página de manual. En este caso, lo siguiente existe en info grep para grep (GNU grep) 3.11 instalado usando Homebrew. Si tu macOS no tiene info, entonces consulta esta respuesta.

   La variable de entorno ‘GREP_OPTIONS’ de ‘grep’ 2.20 y anteriores ya no es compatible, ya que causaba problemas al escribir scripts portables. Para hacer cambios arbitrarios en cómo trabaja ‘grep’, puedes usar un alias o script en su lugar. Por ejemplo, si ‘grep’ está en el directorio ‘/usr/bin’ puedes agregar ‘$HOME/bin’ delante de tu ‘PATH’ y crear un script ejecutable ‘$HOME/bin/grep’ que contenga lo siguiente:

     #! /bin/sh
     export PATH=/usr/bin
     exec grep --color=auto --devices=skip "$@"

Lo anterior me da la siguiente idea de cómo soportar GREP_OPTIONS para tu versión de grep instalado en macOS. Realiza los siguientes cambios en macOS.

  • Crea un archivo de script llamado grep en el directorio /usr/local/bin. El archivo de script debe contener las líneas dadas a continuación. Si lo deseas, puedes omitir la opción --devices=skip.

    #! /bin/sh
    export PATH=/usr/local/opt/grep/libexec/gnubin
    eval set -- "$GREP_OPTIONS" "$@"
    exec grep --devices=skip "$@"
  • Asegúrate de que el script sea ejecutable ingresando el siguiente comando.

    chmod +x /usr/local/bin/grep
  • Asegúrate de que /usr/local/bin sea el primero en la variable PATH. Esto debería ser lo predeterminado. A continuación se muestra mi ruta predeterminada al probar en macOS Monterey.

    % echo PATH
    /usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
  • Exporta la variable GREP_OPTIONS deseada. A continuación se muestra un ejemplo.

    export GREP_OPTIONS='--color=auto'

Versiones Instaladas en Ubuntu 24.04 LTS

GNU bash, versión 5.2.21(1)-release (x86_64-pc-linux-gnu)
zsh 5.9 (x86_64-pc-ubuntu-gnu)
grep (GNU grep) 3.11

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X