
tail -f /var/log/syslog | grep
"arpwatch" 모드를 갖고 jabber를 통해 각 줄을 자체적으로 보내길 원합니다. xargs 사용xmpp [email protected]
tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp [email protected]
작동 안함.
하지만tail /var/log/syslog | grep arpwatch | sendxmpp [email protected]
좋은 결과.
나는 이것이 내가 이해하지 못하는 몇 가지 기본적인 xargs
문제 라고 생각합니다 tail -f
.
답변1
xargs command
한 번의 호출로 최대한 많은 입력 항목(행, 단어)을 수집해 보세요.주문하다이며, 데이터 입력에 걸리는 시간은 특별히 신경 쓰지 않습니다. tail
프로세스가 종료되거나 버퍼 xargs
가 가득 차면 실행됩니다.주문하다그리고 당시 받은 인수. 그러나 tail -f
일반적으로 자체적으로 수행되지 않으며 명령줄 인수가 매우 제한적일 수 있으므로 전혀 작동하지 않는 것처럼 보입니다.
xargs -n1
한 번에 하나의 입력만 전달 하도록 할 수 있습니다 .주문하다, 그러나 xargs
공백을 사용하면 입력이 항목으로 분할되므로 입력 줄을 사용하면 foo bar
명령이 두 번 실행됩니다.
GNU xargs를 사용하면 xargs -n1 -d '\n'
원하는 작업을 수행할 수 있습니다.주문하다입력 줄당 한 번씩 전체 줄이 단일 인수로 전달됩니다.
and 를 사용하거나 사용하지 않고 시도해 보고 -d
출력 -n
타이밍을 확인하세요.
$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'
xargs -L 1
그것도 작동하지만 전체 줄을 하나의 인수로 전달하는 대신 여전히 줄을 별도의 인수로 분할합니다.
답변2
grep
--line-buffered
추가 입력을 기다리지 않고 즉시 각 행을 출력하도록 선택할 수 있습니다 .
의 경우 xargs
@ikkachu가 제안한 대로 공백 대신 개행 문자로 구분해야 합니다. 당신은 그것을 사용할 수 있습니다 xargs -L
.
이것은 작동합니다:
tail -f /var/log/syslog \
| grep --line-buffered arpwatch \
| xargs -L1 sendxmpp [email protected]