Używanie zegarka z rurkami

179

Chciałbym uruchomić to polecenie:

watch -n 1 tail -n 200 log/site_dev.log | grep Doctrine

Ale to nie działa, ponieważ „myślę”, że grep próbuje uruchomić zegarek zamiast ogona ...

Czy istnieje sposób na zrobienie czegoś takiego

watch -n 1 (tail -n 200 log/site_dev.log | grep Doctrine)

Wielkie dzięki!

Tommy B.
źródło

Odpowiedzi:

269

Otocz polecenie cytatem

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'
tonylo
źródło
2
Co jeśli potok zawiera również cytaty (takie jak awk '{print $3}')? Edycja: Tak
OrangeDog
2
możesz uciec od tych znaków za pomocą \, tj.watch -n 'awk \'{print $3}\''
lev
29

Mogę się mylić, ale czy nie osiągnęłoby to tego samego (oglądanie pasujących wierszy dziennika po ich dodaniu) prościej?

tail -f -n 200 log/site_dev.log | grep Doctrine
Mitch
źródło
6
Zgadzam się, że może to być bardziej wydajne, jeśli chodzi o procesor, ale w kontekście tematu „Używanie zegarka z potokami” nie używa zegarka, więc nie jest odpowiedzią. Może to być przykład kiepskiego przykładowego pytania, ponieważ zegarek i fajki wydają się często pojawiać poza kontekstem ogona.
tudor
1
Nie, myślę, że mylisz środki i cel. Użytkownik wyraźnie chciał zobaczyć, jak Doctrineprzybywa w rosnącym pliku, a kiedy spojrzał na swój zestaw narzędzi, jedyną rzeczą, jaką znalazł watch. Tak naprawdę musiał wiedzieć tail -f. Zobacz także meta.stackexchange.com/questions/66377/what-is-the-xy-problem
dland
10
Myślę, że obie są akceptowalnymi odpowiedziami. Górna i zaakceptowana odpowiedź poprawnie odpowiada dokładnie postawionemu pytaniu, a ta odpowiedź poprawnie identyfikuje problem XY, który OP stworzył dla siebie i zapewnia rozwiązanie, którego naprawdę chcieli. Obie odpowiedzi mogą być przydatne dla kogoś, kto napotka to pytanie.
cdhowie 14.04.16
2
Szukałem sposobu na obejrzenie, shellcheck *.sh | grep line | wc -la zaakceptowana odpowiedź była dla mnie przydatna.
Amedee Van Gasse
2

Możesz otoczyć polecenie cytatami:

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'

Jeśli polecenie zawiera cudzysłowy, możesz użyć innego rodzaju cudzysłowów z odpowiednim odstępem:

watch -n 1 $'tail -n 200 log/site_dev.log | fgrep \'Doctrine.*\''

Jeśli próbujesz zrobić coś naprawdę sprytnego, umieść polecenie lub polecenia w skrypcie i użyj tego z zegarkiem:

cat <<EOF >/tmp/watch-command
tail -n 200 $(pwd)/log/site_dev.log | fgrep Doctrine
EOF
chmod +x /tmp/watch-command
watch /tmp/watch-command

Pamiętaj, aby uwzględnić ścieżki względne, jeśli to konieczne.

bschlueter
źródło