tail을 사용할 때 줄 바꿈을 null로 구분하여 변환


20

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

내 질문은 이것과 비슷합니다 : bash에서 null로 구분 된 입력에서`head`와`tail`을 수행하는 방법은 무엇입니까? 하지만 다음과 같은 일을하고 싶다는 점이 다릅니다.

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

답변:


26

마지막 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하기 \0전에 로 변환해야 합니다. tail즉, 파일을 완전히 읽어야합니다.

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

편집 (당신이 변경 이후 tailtail -f귀하의 질문에) :

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

xargs -d '\n'하나는 작동하지만 다른 사람을 위해, 당신은 버퍼링 문제가있는 것입니다. 에서:

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

tr터미널 (여기서는 파이프)로 가지 않을 때 출력을 버퍼링합니다. IE는 쓰기 위해 데이터가 가득 찬 버퍼 (8kiB와 같은 것)를 누적 할 때까지 아무것도 쓰지 않습니다. myCmd배치로 호출 되는 수단 입니다.

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

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

실제로 꼬리에 -f 옵션을 사용하여 줄이 들어올 때마다 계속 인쇄합니다. 이것이 중요하다고 생각하지는 않았지만 분명히 그럴 것입니다. -f 옵션을 사용하면 솔루션이 작동하지 않습니다.
Lars

tail -f myFile.txt | xargs -r0i -d '\n' myCmd "{}" "||" "||"작동 하는 것 같습니다! 감사.
Lars

@Lars, 죄송합니다. -i옵션은 선택적인 인수를 취하므로 -i0작동하지 않습니다. 그것들은 tail -f마지막 것을 제외하고 는 모두 작동해야 하지만 버퍼링으로 인해에서 xargs입력을 받기까지 지연 이 발생합니다 tr. stdbuf -o0 tr '\n' '\0'대신 실행하여 변경할 수 있습니다 tr '\n' '\0'.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.