OSX bash,“看”命令

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

在Mac上我的最佳select是什么,可以在没有下载软件的情况下完成?

您可以使用shell循环来模拟基本function:

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

这将永远循环,清除屏幕,运行你的命令,并等待两秒钟 – 基本watch your_command实现。

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

 #!/bin/bash # usage: watch.sh <your_command> <sleep_duration> while :; do clear date $1 sleep $2 done 

安装了自制软件 :

brew install watch

使用端口 :

 $ sudo port install watch 

上面的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 

这可能是“看”不是你想要的。 你可能想要求助于解决你的问题,而不是在实施你的解决scheme! 🙂

如果您的真正目标是根据tail命令触发的操作触发动作 ,那么您可以将其作为尾部本身的一部分。 而不是定期运行,这是watchfunction,您可以按需运行代码。

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

请注意,即使通过newsyslog或logrotate旋转, tail -F也将继续跟踪日志文件。 你想用这个而不是小写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 

从这里回答:

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

但是,你真的更好安装手表,因为这不是很干净 ..

或者,在〜/ .bashrc中

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

如果手表不想通过安装

 brew install watch 

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

 brew install visionmedia-watch 

https://github.com/tj/watch

我有一个类似的问题。

当我GOOGLE了,我最近遇到这个链接。 这不完全是“安装软件”,只是获取“监视”命令的二进制文件。

链接是OSX的Get watch命令

这是一个稍微改变了这个答案的版本:

  • 检查有效的参数
  • 在顶部显示date和持续时间标题
  • 将“duration”参数作为第一个参数,所以复杂的命令可以很容易地作为剩余的parameter passing。

要使用它:

  • 保存到~/bin/watch
  • 在terminal中执行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 "eg 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 

尝试这个:

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

为了防止闪烁,当您的主要命令需要可感知的时间完成时,您可以捕获输出,只有清除屏幕时完成。

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

然后使用它: watch istats