OSX bash,“看”命令
我正在寻找在Mac OSX上复制Linux“watch”命令的最佳方法。 我希望每隔几秒钟运行一次命令来使用'tail'和'sed'对输出文件的内容进行模式匹配。
在Mac上我的最佳select是什么,可以在没有下载软件的情况下完成?
您可以使用shell循环来模拟基本function:
while :; do clear; your_command; sleep 2; done
这将永远循环,清除屏幕,运行你的命令,并等待两秒钟 – 基本watch your_command
实现。
您可以进一步创build一个watch.sh
脚本,该脚本可以接受your_command
和sleep_duration
作为参数:
#!/bin/bash # usage: watch.sh <your_command> <sleep_duration> while :; do clear date $1 sleep $2 done
安装了自制软件 :
brew install watch
使用端口 :
$ sudo port install watch
上面的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
这可能是“看”不是你想要的。 你可能想要求助于解决你的问题,而不是在实施你的解决scheme! 🙂
如果您的真正目标是根据tail
命令触发的操作触发动作 ,那么您可以将其作为尾部本身的一部分。 而不是定期运行,这是watch
function,您可以按需运行代码。
#!/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
请注意,即使通过newsyslog或logrotate旋转, tail -F
也将继续跟踪日志文件。 你想用这个而不是小写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
从这里回答:
bash -c 'while [ 0 ]; do <your command>; sleep 5; done'
但是,你真的更好安装手表,因为这不是很干净 ..
或者,在〜/ .bashrc中
function watch { while :; do clear; date; echo; $@; sleep 2; done }
如果手表不想通过安装
brew install watch
还有另一个类似/复制版本,安装和完美的工作
brew install visionmedia-watch
我有一个类似的问题。
当我GOOGLE了,我最近遇到这个链接。 这不完全是“安装软件”,只是获取“监视”命令的二进制文件。
链接是OSX的Get watch命令
这是一个稍微改变了这个答案的版本:
- 检查有效的参数
- 在顶部显示date和持续时间标题
- 将“duration”参数作为第一个参数,所以复杂的命令可以很容易地作为剩余的parameter passing。
要使用它:
- 保存到
~/bin/watch
- 在terminal中执行
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 "eg 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
为了防止闪烁,当您的主要命令需要可感知的时间完成时,您可以捕获输出,只有清除屏幕时完成。
function watch {while :; do a=$($@); clear; echo "$(date)\n\n$a"; sleep 1; done}
然后使用它: watch istats