我正在寻找在Mac OS X上复制Linux中的“watch”命令的最佳方法。我想每隔几秒就运行一条命令,使用“tail”和“sed”对输出文件的内容进行模式匹配。
在Mac上,我的最佳选择是什么?是否可以在不下载软件的情况下完成?
我正在寻找在Mac OS X上复制Linux中的“watch”命令的最佳方法。我想每隔几秒就运行一条命令,使用“tail”和“sed”对输出文件的内容进行模式匹配。
在Mac上,我的最佳选择是什么?是否可以在不下载软件的情况下完成?
安装了Homebrew后:
brew install watch
brew
的话,这绝对是正确的做法。 - Maxencewatch
的人,请参考以下链接:https://dev59.com/z2Yr5IYBdhLWcg3wi6vd - jdswatch
指令似乎无法读取用户别名。当我执行 watch somealias
时,会显示“找不到命令”的错误提示。 - RNickMcCandlesswatch [command]
。当你使用 watch somealias
时,它会假定 somealias
是你可以在终端中运行的命令。 - seantomburkeman watch
,你会发现它比一个简单的命令/脚本具有更多的功能,从默认持续时间和可选开关 (-n) 开始。如果避免依赖是首要任务,那么被采纳的答案非常好,但是否则 brew install watch
需要很少的努力,并且可以给你在使用 Linux 时可能习惯的功能。 - fazywhile :; 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
your_command
更改为your_command 2>&1|head -10
。 - Mark Eirichsleep ${2:-1}
来使时间间隔变成可选的。 - Daniel Lubarovecho "$(date)"
和 date
两者是等价的吗? - Daniel Lubarovwatch
。只显示结尾,而watch
则只显示顶部。(两者都不理想) - h__使用MacPorts:
$ sudo port install watch
watch
命令是最好的方式。 - Oliver上面的代码片段足以解决问题,你甚至可以将它们转换为别名(可能需要将其包装在一个函数中以处理参数):
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/安装watch命令:
brew install watch
也许 "watch" 不是你想要的。你可能想要寻求帮助解决问题,而不是只实现解决方案! :)
如果你的真正目标是根据从 "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进行轮换,也将继续跟随日志文件。 你应该使用这个命令而不是小写的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
watch 2 cat *
在运行脚本之前会扩展参数,因此在具有文件 "foo" 和 "bar" 的目录中,您将每2秒运行 cat foo bar
。 您期望的行为是什么? - ghoti*
。尝试在一个窗口中运行:mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*
。当它在运行时,您可以在另一个窗口中touch /tmp/zz/bar
。看看你的“watch”是否在第一个窗口中看到了变化。我不认为会。对我来说也是如此。这与Ubuntu vs OSX或Linux vs Unix无关,而是bash
本身的行为。 - ghotiwatch "ls -l /tmp/zz/*"
但是如果你记得使用引号,它也可以与你的脚本一起工作。 :) - Code Commander如果无法通过安装程序安装 Watch:
brew install watch
我安装了另一个类似/复制版本,它对我来说完美地安装和运行。
brew install visionmedia-watch
visionmedia-watch
- 它默认支持颜色。watch
不支持,无论是否使用 --color
选项。 - Pavel Haluza或者,在你的~/.bashrc文件中:
function watch {
while :; do clear; date; echo; $@; sleep 2; done
}
function watch {while :; do a=$($@); clear; echo "$(date)\n\n$a"; sleep 1; done}
然后通过以下方式使用:
watch istats
echo -e
而不是仅使用echo
,以正确呈现这些换行符。 - jez试试这个:
#!/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