我正在寻找在Mac OSX上复制Linux'watch'命令的最佳方法。我想每隔几秒钟运行一条命令,以使用“ tail”和“ sed”对输出文件的内容进行模式匹配。
在Mac上,我最好的选择是什么,并且无需下载软件就能完成?
我正在寻找在Mac OSX上复制Linux'watch'命令的最佳方法。我想每隔几秒钟运行一条命令,以使用“ tail”和“ sed”对输出文件的内容进行模式匹配。
在Mac上,我最好的选择是什么,并且无需下载软件就能完成?
Answers:
您可以使用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
your_command
为your_command 2>&1|head -10
sleep ${2:-1}
将时间间隔设为可选。
echo "$(date)"
等效于date
?
watch
与输出超过一个屏幕时不一样。仅显示结尾,而watch
仅显示顶部。(都不理想)
随着家酿安装:
brew install watch
brew
在Mac上使用,绝对是必经之路。
watch
: stackoverflow.com/questions/13593771/…–
watch
从BREW似乎并没有读取用户的别名。执行时watch somealias
,找不到命令。
watch [command]
在使用watch somealias
它时进行操作,假设这somealias
是可以在终端中运行的命令。
使用macports:
$ sudo port install watch
watch
直接使用命令更好的方法了。
watch
MacPorts中的命令是否被破坏?
上面的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
即使日志文件被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”的目录中,您将cat foo bar
每2秒运行一次。您期望什么行为?
*
而不会传递给您运行的命令。尝试mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*
在一个窗口中运行:。在运行时,您可以touch /tmp/zz/bar
在另一个窗口中。在第一个窗口中查看您的“手表”是否看到更改。我认为不会。不适合我 这与Ubuntu vs OSX或Linux vs Unix无关,这是它bash
本身的行为。
watch "ls -l /tmp/zz/*"
但是,如果您记得使用引号,它也可以与脚本一起使用。:)
如果手表不想通过安装
brew install watch
还有另一个类似/复制版本,对我而言已安装并完美运行
brew install visionmedia-watch
这是此答案的略有变化的版本:
要使用它:
~/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