OSX bash,'watch'命令

时间:2012-03-05 21:15:22

标签: macos bash automation watch

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

Mac上我最好的选择是什么,可以在不下载软件的情况下完成吗?

13 个答案:

答案 0 :(得分:451)

安装了Homebrew

brew install watch

答案 1 :(得分:292)

您可以使用shell循环模拟基本功能:

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

这将永远循环,清除屏幕,运行命令,等待两秒钟 - 基本watch your_command实施。

您可以更进一步,创建一个watch.sh脚本,可以接受your_commandsleep_duration作为参数:

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

while :; 
  do 
  clear
  date
  $1
  sleep $2
done

答案 2 :(得分:36)

使用ports

$ sudo port install watch

答案 3 :(得分:16)

上面的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 dir; double-quotes around command to keep its args together

或者,自制软件可以从http://procps.sourceforge.net/

安装手表
brew install watch

答案 4 :(得分:13)

可能是“手表”不是你想要的。您可能希望在解决问题时寻求帮助,而不是在实施解决方案时! :)

如果您的真正目标是根据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轮换。您希望使用此而不是小写tail -f。查看man tail了解详情。

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

答案 5 :(得分:9)

回答here的答案:

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

但你真的离installing watch好一点,因为这不是 clean ..

答案 6 :(得分:5)

如果手表不想通过

安装
brew install watch

还有另一个类似/复制版本安装并完美适合我

brew install visionmedia-watch

https://github.com/tj/watch

答案 7 :(得分:4)

或者,在你的〜/ .bashrc

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

答案 8 :(得分:2)

我遇到了类似的问题。

当我用Google搜索时,我最近遇到了这个链接。这并不完全是“安装软件”,只需获取二进制文件即可观看&#39;命令。

链接为Get watch command for OSX

答案 9 :(得分:1)

这是一个稍微改变的版本of this answer

  • 检查有效的参数
  • 在顶部显示日期和持续时间标题
  • 将“duration”参数移动为第一个参数,因此复杂的命令可以作为其余参数轻松传递。

使用它:

  • 将其保存到~/bin/watch
  • 在终端中执行chmod 700 ~/bin/watch以使其可执行。
  • 运行watch 1 echo "hi there"
  • 尝试

<强>〜/斌/观看

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

答案 10 :(得分:1)

试试这个:

#!/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 $@"; echo 
    $@; 
    sleep $sleep; 
done

答案 11 :(得分:1)

当你的主命令需要花费时间来完成时,为了防止闪烁,你可以捕获输出,只有在完成时才清除屏幕。

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

然后按:watch istats

使用它

答案 12 :(得分:1)

使用nix软件包管理器!

先安装nix,然后安装nix-env -iA nixpkgs.watch,并且在完成安装说明(包括在您的shell中采购. "$HOME/.nix-profile/etc/profile.d/nix.sh"之后)应该可以使用它。