Mac OSXでLinuxの「watch」コマンドを複製する最良の方法を探しています。コマンドを数秒ごとに実行して、「tail」と「sed」を使用して出力ファイルの内容をパターンマッチングしたいと思います。
Macでの私の最良の選択肢は何ですか?ソフトウェアをダウンロードせずにそれを行うことができますか?
Mac OSXでLinuxの「watch」コマンドを複製する最良の方法を探しています。コマンドを数秒ごとに実行して、「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
your_command
へyour_command 2>&1|head -10
sleep ${2:-1}
、間隔をオプションにすることを好みます。
echo "$(date)"
と同等date
です。
watch
出力が複数の画面の場合のようには機能しません。終わりwatch
のみを表示し、上部のみを表示します。(どちらも理想的ではありません)
自作インストール:
brew install watch
brew
がマックで使うなら、間違いなく行く方法です。
watch
: stackoverflow.com/questions/13593771/...
watch
はbrewからはユーザーエイリアスを読み取っていないようです。を実行するwatch somealias
と、コマンドが見つかりません。
watch [command]
を使用watch somealias
するときに行うsomealias
ことです。これは、ターミナルで実行できるコマンドであると想定しています。
macportsを使用する:
$ sudo port install watch
watch
コマンドを直接使用するより良い方法はありません。
watch
コマンドは、MacPortsので逮捕しますか?
上記のシェルはトリックを実行します、それらをエイリアスに変換することもできます(パラメータを処理するために関数をラップする必要があるかもしれません)
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
を確認してください。
とはいえ、本当に定期的にコマンドを実行したい場合は、提供されている他の回答を短いシェルスクリプトに変えることができます。
#!/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/*
1つのウィンドウで実行してみてください。実行中はtouch /tmp/zz/bar
、別のウィンドウで操作できます。最初のウィンドウで、「時計」に変化が見られるかどうかを確認します。そうは思わない。それは私にはありません。これは、Ubuntu対OSXまたはLinux対Unixとは関係ありませんbash
。それ自体の動作です。
watch "ls -l /tmp/zz/*"
場合でも、引用符を使用する必要があります。ただし、引用符を使用することを覚えている場合は、スクリプトでも機能します。:)
時計がインストールしたくない場合
brew install watch
インストールして完全に機能した別の類似/コピーバージョンがあります
brew install visionmedia-watch
同様の問題がありました。
私がググったとき、私は最近このリンクに出くわしました。これは正確に「ソフトウェアのインストール」ではなく、単に「watch」コマンドのバイナリを取得するだけです。
そしてリンクはOSX用のGet watchコマンドです
それを使用するには:
~/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
これを試して:
#!/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