![꼬리를 사용할 때 줄 바꿈을 null 구분으로 변환](https://rvso.com/image/52119/%EA%BC%AC%EB%A6%AC%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%EC%A4%84%20%EB%B0%94%EA%BF%88%EC%9D%84%20null%20%EA%B5%AC%EB%B6%84%EC%9C%BC%EB%A1%9C%20%EB%B3%80%ED%99%98.png)
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
답변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
(를) 변환해야 합니다 . 이는 파일을 완전히 읽어야 함을 의미합니다.\0
tail
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
일괄적으로 호출된다는 의미입니다.
GNU 또는 FreeBSD 시스템에서는 다음 명령을 tr
사용하여 버퍼링 동작을 변경할 수 있습니다 stdbuf
.
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2