我正在寻找在mac osx上复制linux"watch"命令的最佳方法。我想每隔几秒钟运行一个命令,使用"tail"和"sed"对输出文件的内容进行模式匹配。
我在Mac电脑上的最佳选择是什么?不下载软件也能做到吗?
当您可以安装它时,为什么要复制它?
因为我必须配置办公室里所有的mac,使用我的脚本
我建议您的脚本安装BREW,然后观看。
BREW的手表似乎无法在我的路径或别名上接收命令。
除了命令之外,您还可以使用application/applications/utilities/console.app来监视日志文件。它允许使用基本搜索进行过滤
这不属于apple.stackexchange.com吗?
您可以使用像BREW这样的包管理器。
BREW的手表不支持Unicode:。/
安装了自制啤酒:
brew install watch
当然,如果你在Mac上使用brew,那该怎么办。
更多细节将不胜感激。当我搜索"BREW Watch OSX"时,这是最热门的搜索结果。编辑:显然是Linux命令。对于那些不知道如何使用watch的人:stackoverflow.com/questions/13593771/…
这个来自BREW的watch似乎没有读取用户别名。当执行watch somealias时,我得到一个未找到的命令。
@nickmc使用watch的正确方法是在使用watch somealias时执行watch [command],假设somealias是一个可以在终端中运行的命令。
您可以使用shell循环模拟基本功能:
while :; do clear; your_command; sleep 2; done
这将永远循环,清除屏幕,运行命令,并等待两秒钟——基本的watch your_command实现。
您可以更进一步,创建一个可以接受your_command和sleep_duration作为参数的watch.sh脚本:
#!/bin/bash
# usage: watch.sh
while :;
do
clear
date
$1
sleep $2
done
我相信Watch只显示输出的第一个屏幕。如果你想做类似的事情,把your_command改为your_command 2>&1|head -10。
这很好,但是我更喜欢sleep ${2:-1}来选择间隔。
另外,它的echo"$(date)"相当于date?
它也不适用于管道。这里有一个改进的分叉:daniel.lubarov.com/simple-watch-script-for-osx
当输出超过一个屏幕时,不会像watch那样工作。只显示结束,而watch只显示顶部。(两者都不理想)
循环和监视之间有什么性能差异吗?
使其可执行
有趣的是:这是可行的,但是brew版本的watch只显示了一些命令的空白屏幕。
使用端口:
$sudo port install watch
没有比直接使用watch命令更好的方法了。
如果要安装它,请使用brew install watch,不要使用macports。
为什么使用BREW而不是MacPorts?
@bmauter,给每个人:stackoverflow.com/questions/21374366/…
@中心轨道,这正是我问的原因。@海林说不要使用MacPorts,但没有说明原因。watch命令是否在MacPorts中中断?
它没有坏掉。这是个糟糕的建议。MacPorts工作得很好,而且有很多包装。用它。
我从来没有从使用MacPorts中恢复过感情。它最终把我的系统搞得一团糟,我不得不重新格式化硬盘。自酿一路--我向你挑战,要找到一些流行的东西,在端口上,而不是在HB上。
上面的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
可能"手表"不是你想要的。你可能想寻求帮助来解决你的问题,而不是实现你的解决方案!:)
如果您的真正目标是根据从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将继续跟踪日志文件,即使它被newsylog或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脚本不适用于bash扩展的参数,例如:watch 2 cat*
@codecommander命令行watch 2 cat *在运行脚本之前会展开参数,因此在文件为"foo"和"bar"的目录中,每2秒运行一次cat foo bar。你期待什么样的行为?
@我只是指出,这种行为与Ubuntu上的watch命令不同。Ubuntu版本显然每两秒钟运行一次命令(每次运行时都会扩展参数),这个脚本在运行前会扩展参数,然后每两秒钟使用相同的参数运行一次。因此,如果您想查看正在添加和删除文件的目录中的文件,这个脚本没有帮助。但是,当您不使用扩展参数时,它是有用的。:)
@codecommander,我想你弄错了。bash(类似sh)扩展*,而不将其传递给运行的命令。试着在一个窗口中运行:mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*。在运行时,您可以在另一个窗口中执行cx1(15)。看看你的"手表"是否在第一个窗口看到了变化。我想不会的。这不适合我。这与Ubuntu与OSX或Linux与Unix无关,这是bash本身的行为。
@戈蒂,你说得对。我错了。即使使用linux watch命令,也需要使用引号:watch"ls -l /tmp/zz/*",但是如果记住使用引号,它也可以与脚本一起使用。:)
从这里回答:
bash -c 'while [ 0 ]; do ; sleep 5; done'
但你最好还是安装手表,因为这不是很干净。
现在更容易了,即使是brew install watch。
如果Watch不想通过安装
brew install watch
还有另一个相似的/复制版本,它为我完美地安装和工作。
brew install visionmedia-watch
网址:https://github.com/tj/watch
或者,在你的~/.bashrc
function watch {
while :; do clear; date; echo; $@; sleep 2; done
}
我也有类似的问题。
当我在谷歌上搜索时,我最近发现了这个链接。这不完全是"安装软件",只是获取"watch"命令的二进制文件。
链接是osx的get watch命令
使用NIX包管理器!
安装nix,然后安装nix-env -iA nixpkgs.watch,在完成安装说明(包括在您的shell中采购."$HOME/.nix-profile/etc/profile.d/nix.sh")之后,它应该可以使用。
为了防止主命令在可感知的时间内完成时闪烁,您可以捕获输出,并且仅在完成后清除屏幕。
function watch {while :; do a=$($@); clear; echo"$(date)
$a"; sleep 1; done}
然后由:watch istats使用
试试这个:
#!/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
下面是这个答案的一个稍有变化的版本:
检查有效参数
在顶部显示日期和工期标题
将"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