예를 들어 실행 중인 프로세스가 있고 해당 실행 중인 프로세스에서 캡처 tail -F watch.txt
하여 stdout
표준 출력의 다른 명령으로 파이프하려면 어떻게 해야 합니까?
다음은 실행 중인 프로세스의 예입니다.
$ tail -F watch.txt
foo
bar
baz
stdout
각 문자열을 캡처하여 새 파일에 쓰거나 다른 명령을 사용하여 각 문자열을 처리하고 싶다고 가정해 보겠습니다 . 예를 들어, terminal-notifier
메시지를 받아들이는 (mac 전용) 명령이 있습니다 terminal-notifier --message "$STDOUT_FROM_TAIL"
.
유닉스에 이미 존재하는 것으로 이것이 가능합니까?
답변1
프로그램을 다시 시작할 수 있다고 가정파이프에 넣은 다음 에 파이프할 수 있지만 xargs
몇 가지 참고할 사항이 있습니다.
- 한 번에 한 줄씩 명령을 실행하려고 합니다(-n 1).
- 출력을 매개변수(-i)에 넣으려고 합니다.
tail
보고 후 즉시 메시지가 실행되기를 원할 수 있으므로 다음이tail
필요합니다 .라인 버퍼.
설치한 항목에 따라 다음과 같습니다.
stdbuf -o 0 tail -f FILE | xargs -i -n 1 terminal-notifier --message "{}"
unbuffer tail -f FILE | xargs " "
(라인 버퍼링) 옵션을 tailf
지원하는 버전을 봤습니다 .-l
Perl을 사용하여 시뮬레이션 할 수도 있습니다 tail -f
.
쉘에서 xargs
특별히 제작된 루프로 대체할 수 있습니다(상당히 표준적이고 보편적임에도 불구하고).for
아니요단순해 보이지만,공백이 포함된 파일 이름 처리유통 중).
프로그램을 다시 시작할 수 없으면 해당 stdout을 가로채야 합니다. 이것은스택 오버플로 답변그것에 대해. 다음과 같은 기타 유틸리티 및 스크립트리디렉션설명되어 있다여기;MacOS와의 호환성에 대해서는 잘 모르겠습니다.
추가 수정
출력은 sed 또는 cut과 같은 유틸리티를 사용하여 정상적으로 구문 분석할 수 있습니다.
unbuffer tail -f 파일 | grep 동물 | sed -e 's/animal(.*) gear/\1/' |
이 방법으로 우리는:
Output by tail output by grep output by sed
correct horse battery staple
animal rhino gear animal rhino gear rhino
llama is animal llama is animal llama is animal
llama peruvian
animal ant gearbox animal ant gearbox antbox
(옵션 사용 가능 --line-buffered
)grep