我正在寻找在Mac OS x上复制Linux 'watch'命令的最佳方法。我想每隔几秒钟运行一个命令,使用'tail'和'sed'对输出文件的内容进行模式匹配。

我在Mac电脑上最好的选择是什么?不下载软件能做到吗?


当前回答

如果手表不想通过安装

brew install watch

有另一个类似的/复制版本,安装和工作完美为我

brew install visionmedia-watch

https://github.com/tj/watch

其他回答

Linux上可用的watch命令在macOS上不存在。如果你不想使用brew,你可以将这个bash函数添加到你的shell配置文件中。

# execute commands at a specified interval of seconds
function watch.command {
  # USAGE: watch.commands [seconds] [commands...]
  # EXAMPLE: watch.command 5 date
  # EXAMPLE: watch.command 5 date echo 'ls -l' echo 'ps | grep "kubectl\\\|node\\\|npm\\\|puma"'
  # EXAMPLE: watch.command 5 'date; echo; ls -l; echo; ps | grep "kubectl\\\|node\\\|npm\\\|puma"' echo date 'echo; ls -1'
  local cmds=()
  for arg in "${@:2}"; do
    echo $arg | sed 's/; /;/g' | tr \; \\n | while read cmd; do
      cmds+=($cmd)
    done
  done
  while true; do
    clear
    for cmd in $cmds; do
      eval $cmd
    done
    sleep $1
  done
}

https://gist.github.com/Gerst20051/99c1cf570a2d0d59f09339a806732fd3

也许“看”并不是你想要的。你可能想要寻求帮助来解决你的问题,而不是实现你的解决方案!:)

如果您的真正目标是根据tail命令中看到的内容触发操作,那么您可以将其作为tail本身的一部分来执行。您可以按需运行代码,而不是像watch那样“定期”运行。

#!/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

请注意,tail -F将继续跟踪日志文件,即使它被newsyslog或logrotate旋转。你想用这个来代替小写的-f。查看男人尾巴了解细节。

也就是说,如果你真的想定期运行一个命令,提供的其他答案可以变成一个简短的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

上面的shell可以做到这一点,你甚至可以将它们转换为别名(你可能需要包装一个函数来处理参数):

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

例子:

myWatch 1 ls ## Self-explanatory
myWatch 5 "ls -lF $HOME" ## Every 5 seconds, list out home directory; double-quotes around command to keep its arguments together

Homebrew也可以从http://procps.sourceforge.net/:上安装手表

brew install watch

当你的主命令需要相当长的时间才能完成时,为了防止闪烁,你可以捕获输出,并只在它完成时清除屏幕。

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

然后用它:

watch istats

或者,在你的~/。bashrc文件:(

function watch {
    while :; do clear; date; echo; $@; sleep 2; done
}