it-swarm-es.tech

OSX bash, comando 'ver'

Estoy buscando la mejor manera de duplicar el comando 'watch' de Linux en Mac OSX. Me gustaría ejecutar un comando cada pocos segundos para hacer coincidir el patrón en el contenido de un archivo de salida usando 'tail' y 'sed'.

¿Cuál es mi mejor opción en una Mac? ¿Se puede hacer sin descargar el software?

249
joseph.hainline

Puede emular la funcionalidad básica con el bucle de Shell:

while :; do clear; your_command; sleep 2; done

Eso se repetirá para siempre, borre la pantalla, ejecute su comando y espere dos segundos, la implementación básica de watch your_command.

Puede llevar esto un paso más allá y crear un script watch.sh que pueda aceptar your_command y sleep_duration como parámetros:

#!/bin/bash
# usage: watch.sh <your_command> <sleep_duration>

while :; 
  do 
  clear
  date
  $1
  sleep $2
done
290
Daniel Pittman

Con Homebrew instalado:

brew install watch

450
seantomburke

Utilice puertos :

$ Sudo port install watch
36
GoTLiuM

los shells anteriores harán el truco, incluso podría convertirlos a un alias (puede que tenga que ajustarse en una función para manejar los parámetros)

alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'

Ejemplos:

myWatch 1 ls ## self-explanatory
myWatch 5 "ls -lF $HOME" ## every 5 seconds, list out home dir; double-quotes around command to keep its args together

Alternativamente, homebrew puede instalar el reloj desde http://procps.sourceforge.net/

brew install watch
16
IT Gumby

Puede ser que "ver" no sea lo que quieres. ¡Probablemente quiera pedir ayuda para resolver su problema, no para implementar su solución! :)

Si su objetivo real es desencadenar acciones basadas en lo que se ve desde el comando tail, entonces puede hacerlo como parte de la propia cola. En lugar de ejecutar "periódicamente", que es lo que hace watch, puede ejecutar su código a pedido .

#!/bin/sh

tail -F /var/log/somelogfile | while read line; do
  if echo "$line" | grep -q '[Ss]ome.regex'; then
    # do your stuff
  fi
done

Tenga en cuenta que tail -F continuará siguiendo un archivo de registro aunque se gire por newsyslog o logrotate Desea utilizar esto en lugar del tail -f minúsculo. Compruebe man tail para más detalles.

Dicho esto, si realmente desea ejecutar un comando periódicamente, las otras respuestas proporcionadas se pueden convertir en un breve script de Shell:

#!/bin/sh
if [ -z "$2" ]; then
  echo "Usage: $0 SECONDS COMMAND" >&2
  exit 1
fi

SECONDS=$1
shift 1
while sleep $SECONDS; do
  clear
  $*
done
13
ghoti

Yendo con la respuesta de aquí :

bash -c 'while [ 0 ]; do <your command>; sleep 5; done'

Pero realmente estás mejor instalando el reloj ya que esto no es muy limpio ..

9
Marvin Pinto

Si el reloj no quiere instalar via

brew install watch

Hay otra versión similar/copia que se instaló y funcionó perfectamente para mí

brew install visionmedia-watch

https://github.com/tj/watch

5
A_funs

O, en tu ~/.bashrc

function watch {
    while :; do clear; date; echo; [email protected]; sleep 2; done
}
4
jon

Tuve un problema similar.

Cuando busqué en Google, encontré este enlace recientemente. Esto no es exactamente 'instalar software', simplemente obteniendo el binario para el comando 'ver'.

Y el enlace es Obtener comando de reloj para OSX

2
sugavaneshb

para evitar el parpadeo cuando su comando principal tarda un tiempo perceptible en completarse, puede capturar la salida y solo borrar la pantalla cuando se hace.

function watch {while :; do a=$([email protected]); clear; echo "$(date)\n\n$a"; sleep 1; done}

entonces úselo por: watch istats

1
tungv

Prueba esto:

#!/bin/bash
# usage: watch [-n integer] COMMAND

case $# in
    0)
        echo "Usage $0 [-n int] COMMAND"
        ;;
    *)      
        sleep=2;
        ;;
esac    

if [ "$1" == "-n" ]; then
    sleep=$2
    shift; shift
fi


while :; 
    do 
    clear; 
    echo "$(date) every ${sleep}s [email protected]"; echo 
    [email protected]; 
    sleep $sleep; 
done
1
Robert Nagtegaal

Utilice el nix package manager!

Instale nix, luego nix-env -iA nixpkgs.watch y debería estar disponible para su uso después de completar las instrucciones de instalación (incluida la fuente . "$HOME/.nix-profile/etc/profile.d/nix.sh" en su Shell).

1
galva

Aquí hay una versión ligeramente modificada de esta respuesta que:

  • comprueba si hay argumentos válidos
  • muestra un título de fecha y duración en la parte superior.
  • mueve el argumento de "duración" para que sea el primer argumento, por lo que los comandos complejos se pueden pasar fácilmente como los argumentos restantes.

Para usarlo:

  • Guarda esto en ~/bin/watch
  • ejecute chmod 700 ~/bin/watch en un terminal para hacerlo ejecutable.
  • pruébalo ejecutando watch 1 echo "hi there"

~/bin/watch

#!/bin/bash

function show_help()
{
  echo ""
  echo "usage: watch [sleep duration in seconds] [command]"
  echo ""
  echo "e.g. To cat a file every second, run the following"
  echo ""
  echo "     watch 1 cat /tmp/it.txt" 
  exit;
}

function show_help_if_required()
{
  if [ "$1" == "help" ]
  then
      show_help
  fi
  if [ -z "$1" ]
    then
      show_help
  fi
}

function require_numeric_value()
{
  REG_EX='^[0-9]+$'
  if ! [[ $1 =~ $REG_EX ]] ; then
    show_help
  fi
}

show_help_if_required $1
require_numeric_value $1

DURATION=$1
shift

while :; do 
  clear
  echo "Updating every $DURATION seconds. Last updated $(date)"
  bash -c "$*"
  sleep $DURATION
done
1
Brad Parks