꼬리를 사용할 때 줄 바꿈을 빈 구분 기호로 변환

꼬리를 사용할 때 줄 바꿈을 빈 구분 기호로 변환

tail개행 대신 null로 끝나는 줄을 사용 하도록 출력을 어떻게 변경할 수 있습니까 ?

내 문제는 다음과 유사합니다.bash에서 null로 구분된 입력에서 "머리"와 "꼬리"를 수행하는 방법은 무엇입니까?, 그러나 차이점은 다음과 같은 작업을 원한다는 것입니다.

tail -f myFile.txt | xargs -i0 myCmd {} "arg1" "arg2"

써본적이 없어서 find못쓰겠어요-print0

이는 xargs의 오류를 방지하기 위한 것입니다.

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

답변1

마지막 10개 행을 원하는 경우:

tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2

그러나 GNU를 사용하면 xargs구분 기호를 개행 문자로 설정할 수도 있습니다.

tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2

( -0예의 약어 -d '\0').

이식 가능한 경우 각 문자를 간단히 이스케이프할 수도 있습니다.

tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2

또는 각 줄을 인용하십시오.

tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2

NUL로 구분된 마지막 10개의 레코드를 원할 경우 myFile.txt(그러나 텍스트 파일은 아님) 를 호출하기 전에 이를 변환해야 합니다. \n이는 파일을 완전히 읽어야 함을 의미합니다.\0tail

tr '\n\0' '\0\n' < myFile.txt |
  tail |
  tr '\n\0' '\0\n' |
  xargs -r0i myCmd {} arg1 arg2

편집하다(질문에서 로 변경한 이후 tail):tail -f

위의 마지막 항목은 분명히 이해가 되지 않습니다 tail -f.

하나는 xargs -d '\n'작동하지만 다른 것에는 버퍼링 문제가 있습니다. 존재하다:

tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2

tr터미널(여기서는 파이프)에 도달하지 못할 때 출력을 버퍼링합니다. IE에서는 쓸 데이터의 전체 버퍼(약 8kiB)가 축적될 때까지 아무것도 쓰지 않습니다. 이는 myCmd일괄적으로 호출된다는 의미입니다 .

trGNU 또는 FreeBSD 시스템에서는 다음 명령을 사용하여 버퍼링 동작을 변경할 수 있습니다 stdbuf.

tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
  xargs -r0i myCmd {} arg1 arg2

관련 정보