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
Mac에서 사용한다면 확실히 갈 길 입니다.
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
"시계"가 원하는 것이 아닐 수도 있습니다. 솔루션 구현이 아닌 문제 해결에 도움을 요청하고 싶을 것입니다. :)
실제 목표가 command 에서 본 내용을 기반으로 작업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/*
한 창 에서 다음 을 실행하십시오 . 그것이 실행되는 동안 touch /tmp/zz/bar
다른 창에서 할 수 있습니다 . 첫 번째 창에서 "시계"에 변경 사항이 표시되는지 확인하십시오. 나는 그렇게 생각하지 않습니다. 그것은 나를 위해하지 않습니다. 이것은 Ubuntu vs OSX 또는 Linux vs Unix와 관련이 없으며 bash
자체 동작입니다 .
watch "ls -l /tmp/zz/*"
그러나 따옴표 를 기억하는 경우 스크립트에서도 작동합니다. :)
시계를 통해 설치하지 않으려는 경우
brew install watch
나를 위해 완벽하게 설치되고 작동 한 다른 유사 / 복사 버전이 있습니다.
brew install visionmedia-watch
나는 비슷한 문제가 있었다.
내가봤을 때 최근 에이 링크를 보았습니다. 이것은 정확히 '소프트웨어 설치'가 아니라 단순히 'watch'명령의 바이너리를 얻는 것입니다.
그리고 링크는 OSX에 대한 감시 명령입니다
그것을 사용하려면 :
~/bin/watch
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 "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