OSX bash, lệnh 'xem'


292

Tôi đang tìm cách tốt nhất để sao chép lệnh 'xem' của Linux trên Mac OSX. Tôi muốn chạy một lệnh một vài giây để khớp mẫu trên nội dung của tệp đầu ra bằng cách sử dụng 'đuôi' và 'sed'.

Lựa chọn tốt nhất của tôi trên máy Mac là gì và có thể thực hiện mà không cần tải xuống phần mềm không?


2
Tại sao bạn muốn sao chép nó khi bạn chỉ có thể cài đặt nó?
Andrew Marshall

3
bởi vì tôi phải định cấu hình tất cả các máy Mac trong văn phòng sử dụng tập lệnh của tôi
joseph.hainline

Tôi sẽ đề nghị rằng kịch bản của bạn cài đặt brew và sau đó xem.
AsTeR

Đồng hồ của hãng bia dường như không nhận lệnh trên đường dẫn hoặc bí danh của tôi.
sam boosalis

Ngoài ra, với lệnh bạn cũng có thể sử dụng ứng dụng /Appluggest/Utilities/Console.app để theo dõi các tệp nhật ký. Nó cho phép lọc với tìm kiếm cơ bản
JuanMa Cuevas 27/2/2015

Câu trả lời:


335

Bạn có thể mô phỏng chức năng cơ bản với vòng lặp shell:

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

Điều đó sẽ lặp lại mãi mãi, xóa màn hình, chạy lệnh của bạn và đợi hai giây - việc watch your_commandthực hiện cơ bản .

Bạn có thể tiến thêm một bước này và tạo một watch.shtập lệnh có thể chấp nhận your_commandsleep_durationlàm tham số:

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

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

2
Tôi tin rằng đồng hồ chỉ hiển thị màn hình đầu ra đầu tiên. Nếu bạn muốn làm điều gì đó tương tự, hãy đổi your_commandthànhyour_command 2>&1|head -10
Mark Eirich

10
Điều này hoạt động khá tốt, nhưng tôi thích sleep ${2:-1}làm cho khoảng thời gian tùy chọn.
Daniel Lubarov

2
Ngoài ra, nó echo "$(date)"tương đương với date?
Daniel Lubarov

5
Nó cũng không hoạt động với đường ống. Đây là một ngã ba với nhiều cải tiến khác nhau: daniel.lubarov.com/simple-watch-script-for-osx
Daniel Lubarov

Không hoạt động như watchkhi đầu ra nhiều hơn một màn hình. Chỉ hiển thị kết thúc, trong khi watchchỉ hiển thị đầu. (Không phải là lý tưởng)
h__

545

Với Homebrew được cài đặt:

brew install watch


23
Chắc chắn là cách để đi nếu bạn sử dụng brewtrên mac.
Tối đa

2
Thêm chi tiết sẽ được đánh giá cao. Khi tôi tìm kiếm "brew watch osx", đây là kết quả tìm kiếm hàng đầu. EDIT: Rõ ràng đó là một lệnh Linux. Đối với những người không chắc chắn làm thế nào để sử dụng watch: stackoverflow.com/questions/13593771/...
GWG

2
Điều này watchtừ brew dường như không đọc được bí danh người dùng. Khi thực hiện watch somealias, tôi nhận được một lệnh không tìm thấy.
RNickMcCandless

@NickMc cách sử dụng đồng hồ thích hợp là làm watch [command]khi bạn sử dụng watch somealias, giả sử đó somealiaslà một lệnh mà bạn có thể chạy trong thiết bị đầu cuối của mình.
seantomburke

38

Sử dụng macports :

$ sudo port install watch

3
Không có cách nào tốt hơn sau đó sử dụng watchlệnh trực tiếp.
Oliver

8
Tại sao nên sử dụng bia thay vì MacPorts?
bmauter

1
@bmauter, để mỗi họ riêng: stackoverflow.com/questions/21374366/...
CenterOrbit

4
@CenterOrbit, đó chính xác là lý do tại sao tôi hỏi. @ joseph.hainline nói không sử dụng MacPorts, nhưng không nêu rõ lý do. Là watchlệnh bị vỡ trong MacPorts?
bmauter

Nó không bị vỡ. Đó là lời khuyên khủng khiếp. MacPorts hoạt động tuyệt vời và có hàng tấn gói. Sử dụng nó.
Ali Gangji

16

các shell ở trên sẽ thực hiện thủ thuật, thậm chí bạn có thể chuyển đổi chúng thành bí danh (có thể cần phải bọc trong một hàm để xử lý các tham số)

alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'

Ví dụ:

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

Thay phiên, homebrew có thể cài đặt đồng hồ từ http://procps.sourceforge.net/

brew install watch

14

Nó có thể là "xem" không phải là những gì bạn muốn. Bạn có thể muốn yêu cầu giúp đỡ trong việc giải quyết vấn đề của bạn, không phải trong việc thực hiện giải pháp của bạn! :)

Nếu mục tiêu thực sự của bạn là kích hoạt các hành động dựa trên những gì nhìn thấy từ taillệnh , thì bạn có thể thực hiện điều đó như một phần của chính đuôi. Thay vì chạy "định kỳ", đó là những gì watchbạn có thể chạy mã theo yêu cầu .

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

Lưu ý rằng tail -Fsẽ tiếp tục theo dõi một tệp nhật ký ngay cả khi nó được xoay vòng bởi newsyslog hoặc logrotate. Bạn muốn sử dụng điều này thay vì chữ thường tail -f. Kiểm tra man tailđể biết chi tiết.

Điều đó nói rằng, nếu bạn thực sự muốn chạy một lệnh theo định kỳ, các câu trả lời khác được cung cấp có thể được chuyển thành một tập lệnh shell ngắn:

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

Thật không may, tập lệnh shell này không hoạt động với các tham số bash được mở rộng, chẳng hạn như: xem 2 con mèo *
Code Commander

1
@CodeCommander - Dòng lệnh watch 2 cat *sẽ mở rộng các tham số trước khi chạy tập lệnh, vì vậy trong một thư mục có tệp "foo" và "bar", bạn sẽ chạy cat foo barcứ sau 2 giây. Những hành vi bạn đang mong đợi?
ghoti

@ghoti Tôi chỉ đơn thuần chỉ ra rằng hành vi đó khác với lệnh xem trên Ubuntu. Phiên bản Ubuntu dường như chạy lệnh cứ sau hai giây (mở rộng các tham số mỗi lần chạy), tập lệnh này có các tham số được mở rộng trước khi chạy, và sau đó chạy bằng các tham số tương tự cứ sau hai giây. Vì vậy, nếu bạn muốn xem các tập tin trong một thư mục nơi các tập tin đang được thêm và xóa tập lệnh này không có ích. Nó rất hữu ích khi bạn không sử dụng các tham số mở rộng. :)
Chỉ huy mã

@CodeCommander, tôi nghĩ bạn đã nhầm. Bash (như sh) mở rộng *mà không chuyển nó tới lệnh bạn chạy. Hãy thử chạy: mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*trong một cửa sổ. Trong khi đang chạy, bạn có thể touch /tmp/zz/barở một cửa sổ khác. Xem nếu "đồng hồ" của bạn nhìn thấy sự thay đổi, trong cửa sổ đầu tiên. Tôi không nghĩ nó sẽ như vậy. Nó không dành cho tôi. Điều này không liên quan gì đến Ubuntu vs OSX hay Linux vs Unix, đó là hành vi của bashchính nó.
ghoti

1
@ghoti, bạn nói đúng. Tôi đã lầm. Ngay cả với lệnh đồng hồ Linux, bạn cần sử dụng dấu ngoặc kép: watch "ls -l /tmp/zz/*"nhưng nếu bạn nhớ sử dụng dấu ngoặc kép thì nó cũng hoạt động với tập lệnh của bạn. :)
Chỉ huy mã


6

Nếu đồng hồ không muốn cài đặt qua

brew install watch

Có một phiên bản tương tự / sao chép khác đã cài đặt và hoạt động hoàn hảo cho tôi

brew install visionmedia-watch

https://github.com/tj/watch


5

Hoặc, trong ~ / .bashrc của bạn

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

2

Tôi đã có một vấn đề tương tự.

Khi tôi googled, tôi đã xem qua liên kết này gần đây. Đây không chính xác là 'cài đặt phần mềm', chỉ đơn giản là nhận lệnh nhị phân cho lệnh 'xem'.

Và liên kết là Nhận lệnh xem cho OSX


1

Đây là một phiên bản thay đổi một chút của câu trả lời này rằng:

  • kiểm tra đối số hợp lệ
  • hiển thị một tiêu đề ngày và thời gian ở trên cùng
  • di chuyển đối số "thời gian" thành đối số thứ nhất, vì vậy các lệnh phức tạp có thể dễ dàng được chuyển qua như các đối số còn lại.

Để dùng nó:

  • Lưu cái này vào ~/bin/watch
  • hành hình chmod 700 ~/bin/watch trong một thiết bị đầu cuối để làm cho nó thực thi.
  • thử nó bằng cách chạy watch 1 echo "hi there"

~ / thùng / đồng hồ

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

Thử cái này:

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

để tránh nhấp nháy khi lệnh chính của bạn mất thời gian có thể nhận biết để hoàn thành, bạn có thể chụp đầu ra và chỉ xóa màn hình khi hoàn tất.

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

sau đó sử dụng nó bằng cách: watch istats


0

Sử dụng trình quản lý gói nix !

Cài đặt nix, sau đó nix-env -iA nixpkgs.watchvà nó sẽ có sẵn để sử dụng sau khi hoàn thành các hướng dẫn cài đặt (bao gồm cả nguồn . "$HOME/.nix-profile/etc/profile.d/nix.sh"trong vỏ của bạn).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.