OSX bash、 'watch'コマンド


292

Mac OSXでLinuxの「watch」コマンドを複製する最良の方法を探しています。コマンドを数秒ごとに実行して、「tail」と「sed」を使用して出力ファイルの内容をパターンマッチングしたいと思います。

Macでの私の最良の選択肢は何ですか?ソフトウェアをダウンロードせずにそれを行うことができますか?


2
インストールできるのに、なぜ複製したいのですか?
アンドリューマーシャル

3
私のスクリプトを使用するオフィス内のすべてのMacを構成する必要があるため
joseph.hainline

スクリプトでbrewをインストールしてから監視することをお勧めします。
AsTeR 2013

brewの時計が私のパスやエイリアスでコマンドを取得していないようです。
sam boosalis 14

コマンドの代わりに、アプリケーション/Applications/Utilities/Console.appを使用してログファイルを監視することもできます。基本的な検索によるフィルタリングが可能
JuanMa Cuevas

回答:


335

シェルループで基本的な機能をエミュレートできます。

while :; do clear; your_command; sleep 2; done

これは永久にループし、画面をクリアし、コマンドを実行して、2秒間待機します-基本的なwatch your_command実装です。

あなたはさらに一歩これを取ると、作成することができますwatch.sh受け入れることができ、スクリプトyour_commandsleep_durationパラメータなどを:

#!/bin/bash
# usage: watch.sh <your_command> <sleep_duration>

while :; 
  do 
  clear
  date
  $1
  sleep $2
done

2
時計は最初の画面の出力しか表示しないと思います。あなたが似た何かをしたい場合は、変更your_commandyour_command 2>&1|head -10
マーク・アイリッヒ

10
これはかなりうまくいきますがsleep ${2:-1}、間隔をオプションにすることを好みます。
Daniel Lubarov 2013年

2
また、?echo "$(date)"と同等dateです。
Daniel Lubarov 2013年

5
また、パイプでは機能しません。さまざまな改良が施されたフォークは次のとおり
Daniel Lubarov

watch出力が複数の画面の場合のようには機能しません。終わりwatchのみを表示し、上部のみを表示します。(どちらも理想的ではありません)
h__ 2014

545

自作インストール:

brew install watch


23
あなたbrewがマックで使うなら、間違いなく行く方法です。
Maxence 2014年

2
詳細をいただければ幸いです。「brew watch osx」を検索すると、これがトップ検索結果です。編集:どうやらそれはLinuxのコマンドです。使い方がわからなかった人のためにwatch stackoverflow.com/questions/13593771/...
GWG

2
これwatchはbrewからはユーザーエイリアスを読み取っていないようです。を実行するwatch somealiasと、コマンドが見つかりません。
RNickMcCandless

@NickMcを使用する適切な方法は、それwatch [command]を使用watch somealiasするときに行うsomealiasことです。これは、ターミナルで実行できるコマンドであると想定しています。
seantomburke

38

macportsを使用する:

$ sudo port install watch

3
watchコマンドを直接使用するより良い方法はありません。
オリバー

8
MacPortsの代わりにbrewを使用する理由
2015年

1
:それぞれ独自に@bmauter、stackoverflow.com/questions/21374366/...
CenterOrbit

4
@CenterOrbit、それがまさに私が尋ねた理由です。@ joseph.hainlineはMacPortsを使用しないと言っていますが、その理由は述べていません。されたwatchコマンドは、MacPortsので逮捕しますか?
bmauter 2015年

逮捕されていません。それはひどいアドバイスです。MacPortsは素晴らしい働きをし、たくさんのパッケージがあります。これを使って。
Ali Gangji

16

上記のシェルはトリックを実行します、それらをエイリアスに変換することもできます(パラメータを処理するために関数をラップする必要があるかもしれません)

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

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

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

残念ながら、このシェルスクリプトは次のようなbash拡張パラメーターでは機能しません。watch2 cat *
Code Commander

1
@CodeCommander-コマンドラインwatch 2 cat *はスクリプトを実行する前にパラメーターを展開するため、ファイル「foo」と「bar」のあるディレクトリでは、cat foo bar2秒ごとに実行します。どのような行動を期待していましたか?
ghoti 2013

@ghoti動作がUbuntuのwatchコマンドと異なることを指摘しているだけです。Ubuntuバージョンは、2秒ごとにコマンドを実行するようです(実行されるたびにパラメーターが展開されます)。このスクリプトでは、実行前にパラメーターが展開され、2秒ごとに同じパラメーターを使用して実行されます。したがって、ファイルが追加および削除されるディレクトリ内のファイルを監視する場合、このスクリプトは役に立ちません。ただし、拡張パラメーターを使用しない場合に役立ちます。:)
コードコマンダー

@CodeCommander、あなたは間違っていると思います。bash(shなど)は*、実行するコマンドに渡さずに展開します。mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*1つのウィンドウで実行してみてください。実行中はtouch /tmp/zz/bar、別のウィンドウで操作できます。最初のウィンドウで、「時計」に変化が見られるかどうかを確認します。そうは思わない。それは私にはありません。これは、Ubuntu対OSXまたはLinux対Unixとは関係ありませんbash。それ自体の動作です。
ghoti 2013

1
@ghoti、あなたは正しい。間違えた。Linuxのwatchコマンドを使用するwatch "ls -l /tmp/zz/*"場合でも、引用符を使用する必要があります。ただし、引用符を使用することを覚えている場合は、スクリプトでも機能します。:)
コードコマンダー


6

時計がインストールしたくない場合

brew install watch

インストールして完全に機能した別の類似/コピーバージョンがあります

brew install visionmedia-watch

https://github.com/tj/watch


5

または、〜/ .bashrc

function watch {
    while :; do clear; date; echo; $@; sleep 2; done
}

2

同様の問題がありました。

私がググったとき、私は最近このリンクに出くわしました。これは正確に「ソフトウェアのインストール」ではなく、単に「watch」コマンドのバイナリを取得するだけです。

そしてリンクはOSX用のGet watchコマンドです


1

これは、この回答のわずかに変更されたバージョンです

  • 有効な引数をチェックします
  • 上部に日付と期間のタイトルを表示します
  • 「期間」引数を最初の引数に移動するため、複雑なコマンドを残りの引数として簡単に渡すことができます。

それを使用するには:

  • これを保存 ~/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

1

これを試して:

#!/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

1

メインコマンドが完了するまでにかなりの時間がかかる場合のちらつきを防ぐために、出力をキャプチャして、完了時にのみ画面をクリアすることができます。

function watch {while :; do a=$($@); clear; echo "$(date)\n\n$a"; sleep 1; done}

次にそれを使用します: watch istats


0

nixパッケージマネージャーを使用してください!

nixをnix-env -iA nixpkgs.watchインストールすると、インストール手順(. "$HOME/.nix-profile/etc/profile.d/nix.sh"シェルでの調達を含む)の完了後に使用できるようになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.