私は、Mac OS XでLinuxの「監視」コマンドを複製するための最良の方法を探しています。 'tail'と 'sed'を使って出力ファイルの内容をパターンマッチングするために数秒ごとにコマンドを実行したいのですが。
Macでの私の最良の選択は何ですか、そしてそれはソフトウェアをダウンロードすることなく行うことができますか?
シェルループを使って基本的な機能をエミュレートできます。
while :; do clear; your_command; sleep 2; done
これは永久にループし、画面をクリアし、コマンドを実行し、そして2秒間待ちます - 基本的な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
と 自作 がインストールされている:
brew install watch
ports を使ってください。
$ Sudo port install watch
上記のシェルがうまくいくでしょう、あなたはそれらをエイリアスに変換することさえできます(パラメータを扱うために関数でラップする必要があるかもしれません)
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
Newsyslogやlogrotateによってローテーションされても、tail -F
はログファイルを追跡し続けます。小文字のtail -f
の代わりにこれを使いたいのです。詳細についてはman tail
を確認してください。
とは言っても、本当に定期的にコマンドを実行したいのであれば、提供される他の答えは短いシェルスクリプトに変えることができます。
#!/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
時計が経由でインストールしたくない場合
brew install watch
私のためにインストールされ、完璧に機能した別の類似した/コピーのバージョンがあります。
brew install visionmedia-watch
または、〜/ .bashrcに
function watch {
while :; do clear; date; echo; $@; sleep 2; done
}
私は同様の問題を抱えていました。
グーグルしたとき、私は最近このリンクに出くわしました。これは厳密には「ソフトウェアのインストール」ではなく、単に「watch」コマンドのバイナリを取得することです。
そしてリンクは OSX用のwatchコマンドを入手 です。
あなたのメインコマンドが完了するのに知覚できる時間がかかるときにちらつきを防ぐために、あなたはそれが終わったときにだけ出力をキャプチャしてスクリーンをクリアすることができます。
function watch {while :; do a=$($@); clear; echo "$(date)\n\n$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
nix パッケージマネージャを使ってください。
Nixをインストールしてからnix-env -iA nixpkgs.watch
をインストールすると、インストール手順を完了した後で使用できるようになります(シェルでの. "$HOME/.nix-profile/etc/profile.d/nix.sh"
の入手を含む)。
これはわずかに変更されたバージョンです この答えの それ:
使用するには:
~/bin/watch
に保存しますchmod 700 ~/bin/watch
を実行します。watch 1 echo "hi there"
を実行して試してください。〜/ bin/watch
#!/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