OS X Bash '手表'命令

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

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

199670 次浏览

你可以用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

我将使用来自在这里的答案:

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

但是你最好使用安装的手表,因为这不是非常清洁

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

如果你的真正目标是根据从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

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

另外,家酿可以从http://procps.sourceforge.net/安装手表:

brew install watch

使用MacPorts:

$ sudo port install watch

或者,在你的~ / . bashrc文件中:

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

安装家酿后:

brew install watch

下面是稍微改变的这个答案版本:

  • 检查有效参数
  • 在顶部显示日期和持续时间标题
  • 将"duration"参数移动到第一个参数,这样复杂的命令可以很容易地作为其余参数传递。

使用它:

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

~ / bin /手表

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

试试这个:

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

如果手表不想通过安装

brew install watch

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

brew install visionmedia-watch

https://github.com/tj/watch

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

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

然后用它:

watch istats

使用女水妖包管理器!

安装Nix,然后执行nix-env -iA nixpkgs.watch,它应该可以在完成安装说明后使用(包括在shell中查找. "$HOME/.nix-profile/etc/profile.d/nix.sh")。

在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