sed 및 xargs와 함께 tail -f를 사용하십시오.

sed 및 xargs와 함께 tail -f를 사용하십시오.

/tmp/test매초마다 파일에 숫자 + 작은따옴표를 쓰는 다음 프로세스가 있다고 가정해 보겠습니다.

for i in {1..1000} ; do echo $i\' ; sleep 1 ; done > /tmp/test

tail -f그런 다음 다른 기능을 통해 사용하고 실행하고 싶습니다 . 테스트 목적으로 다음을 사용하고 있습니다 echo.

tail -f /tmp/test | xargs echo

이로 인해 다음과 같은 오류가 발생합니다(입력에 따옴표 없이 실행하면 문제 없음).

xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option

방정식에 sed를 추가하면 전혀 결과가 나오지 않습니다.

tail -f /tmp/test | sed "s/['\"]//g" | xargs echo

추가한 후 출력을 얻지 못하는 이유나 sed입력하기 전에 입력에서 따옴표를 제거하는 방법에 대한 아이디어가 있습니까 xargs?

답변1

많은 것들이 있습니다.

첫째: "tail -f"는 완료되지 않으므로 "xargs"도 마찬가지로 무기한으로 계속 실행됩니다. 두 번째 창을 열어 "tail -f" 프로세스를 "kill -HUP"하여 "tail -f" 및 "xargs"를 완료하여 출력을 생성할 수 있습니다.

둘째: "xargs"는 입력을 버퍼링하고 "전체 버퍼"라고 생각되는 것을 얻지 못합니다. 따라서 1000초 표시가 출력될 때 echo 명령을 한 번도 실행하지 않았습니다. "xargs"가 각 입력 행에 대해 개별적으로 echo를 실행하도록 하려면 xargs에 "-n 1" 옵션을 추가해야 합니다.

작은 따옴표를 좋아하지 않는 "xargs"의 경우 "-d '\n'" 옵션을 사용하여 따옴표 처리를 비활성화하고 입력 인수만 개행으로 구분할 수 있습니다.

답변2

아마도

tail -f /tmp/test | sed "s/['\"]//g" | while read line; do
  do_something "$line"
done

확인해보세요:https://stackoverflow.com/questions/199266/make-xargs-execute-the-command-once-for-each-line-of-input

관련 정보