jos*_*ine 270 macos bash automation watch
我正在寻找在Mac OSX上复制Linux"watch"命令的最佳方法.我想每隔几秒运行一个命令,使用'tail'和'sed'对输出文件的内容进行模式匹配.
什么是我在Mac上的最佳选择,是否可以在不下载软件的情况下完成?
sea*_*rke 499
随着Homebrew的安装:
brew install watch
Dan*_*man 313
您可以使用shell循环模拟基本功能:
while :; do clear; your_command; sleep 2; done
Run Code Online (Sandbox Code Playgroud)
这将永远循环,清除屏幕,运行您的命令,并等待两秒钟 - 基本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
Run Code Online (Sandbox Code Playgroud)
小智 38
使用端口:
$ sudo port install watch
Run Code Online (Sandbox Code Playgroud)
IT *_*mby 16
上面的shell将完成这个技巧,你甚至可以将它们转换为别名(可能需要包装一个函数来处理参数)
alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'
Run Code Online (Sandbox Code Playgroud)
例子:
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
Run Code Online (Sandbox Code Playgroud)
或者,自制软件可以从http://procps.sourceforge.net/安装手表
brew install watch
Run Code Online (Sandbox Code Playgroud)
gho*_*oti 14
可能是"手表"不是你想要的.您可能希望在解决问题时寻求帮助,而不是在实施解决方案时!:)
如果您的真正目标是根据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
Run Code Online (Sandbox Code Playgroud)
请注意,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
Run Code Online (Sandbox Code Playgroud)
回答这里的答案:
bash -c 'while [ 0 ]; do <your command>; sleep 5; done'
Run Code Online (Sandbox Code Playgroud)
但你最好安装手表,因为这不是很干净 ..
小智 6
或者,在您的~/.bashrc文件中:
function watch {
while :; do clear; date; echo; $@; sleep 2; done
}
Run Code Online (Sandbox Code Playgroud)
如果手表不想通过安装
brew install watch
Run Code Online (Sandbox Code Playgroud)
还有另一个类似/复制版本安装并完美地为我工作
brew install visionmedia-watch
Run Code Online (Sandbox Code Playgroud)
小智 6
为了防止在主命令需要可感知的时间才能完成时闪烁,您可以捕获输出并仅在完成后清除屏幕。
function watch {while :; do a=$($@); clear; echo "$(date)\n\n$a"; sleep 1; done}
Run Code Online (Sandbox Code Playgroud)
然后通过以下方式使用它:
watch istats
Run Code Online (Sandbox Code Playgroud)