cat <<EOS | sed -ne '1{h;d;}' -e 'H;${G;p;}'
line 1
line 2
line 3
EOS
이것을 사용하는 것으로 변환하는 문제 tail는 tail파일의 끝을 찾기 위해 전체 파일을 읽어야한다는 것입니다. 파이프 라인에서 사용하려면
- 문서의 전체 내용을에 제공하십시오
tail.
- 를 제공 다시 에
cat.
- 그와 같은 순서로.
까다로운 비트는 문서의 내용을 복제하는 tee것이 아니라 tail중간 임시 파일을 사용하지 않고 나머지 문서가 출력되기 전에 출력을 얻는 것입니다.
사용 sed(또는 awk같은 John1024하는 일은 ) 메모리에 데이터를 저장하여 데이터와 주문 문제의 이중 파싱를 제거한다.
sed내가 제안 하는 해결책은
1{h;d;}, 첫 번째 줄을 보류 공간에 그대로 저장하고 다음 줄로 건너 뜁니다.
H개행 문자가 포함 된 보류 공간에 서로 다른 행을 추가하십시오.
${G;p;}개행 문자가 포함 된 마지막 행에 보류 공간을 추가하고 결과 데이터를 인쇄하십시오.
이것은 sedPOSIX 표준이 홀드 공간이 최소 8192 바이트 (8 KiB)임을 보장한다는 경고와 함께 John1024의 솔루션을 문자 그대로 번역 한 것입니다. 그러나이 버퍼는 필요에 따라 동적으로 할당되고 확장되는 것이 좋습니다 . sedBSD가하고 있습니다 sed).
명명 된 파이프를 사용하도록 허용하는 경우 :
mkfifo mypipe
cat <<EOS | tee mypipe | cat <( tail -n 1 mypipe ) -
line 1
line 2
line 3
EOS
rm -f mypipe
이것은 tee데이터를 다운 mypipe받는 동시에 에 전송하는 데 사용 됩니다 cat. cat유틸리티는 첫번째의 출력 읽습니다 tail(에서 읽고 mypipe, tee쓰고있는)을, 다음에서 직접 오는 문서의 복사본을 추가합니다 tee.
그러나 문서 에 파이프의 버퍼 크기보다 큰 파일 이 너무 큰 경우 (이름이없는) 파이프가 비워지기를 기다리는 동안 tee쓰기 mypipe및 쓰기 cat가 차단 된다는 점에서 심각한 결함이 있습니다 . cat읽을 때까지 비워지지 않습니다 . 끝날 cat때까지 읽지 않았습니다 tail. 그리고 tail끝날 때까지 tee끝나지 않을 것 입니다. 이것은 전형적인 교착 상태입니다.
변형
tee >( tail -n 1 >mypipe ) | cat mypipe -
같은 문제가 있습니다.