我正在寻找在Mac OSX上复制Linux“watch”命令的最佳方法。我想每隔几秒运行一个命令,使用'tail'和'sed'对输出文件的内容进行模式匹配。
Mac上我最好的选择是什么,可以在不下载软件的情况下完成吗?
答案 0 :(得分:451)
安装了Homebrew:
brew install watch
答案 1 :(得分:292)
您可以使用shell循环模拟基本功能:
while :; do clear; your_command; sleep 2; done
这将永远循环,清除屏幕,运行命令,等待两秒钟 - 基本watch your_command
实施。
您可以更进一步,创建一个watch.sh
脚本,可以接受your_command
和sleep_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
答案 7 :(得分:4)
或者,在你的〜/ .bashrc
中function watch {
while :; do clear; date; echo; $@; sleep 2; done
}
答案 8 :(得分:2)
答案 9 :(得分:1)
这是一个稍微改变的版本of this answer:
使用它:
~/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"
之后)应该可以使用它。