Bash 파이프라인의 스트림 처리를 사용하여 연속적인 단일 데이터 행을 처리하시겠습니까?

Bash 파이프라인의 스트림 처리를 사용하여 연속적인 단일 데이터 행을 처리하시겠습니까?

지정된 네트워크 포트에 연속적인 한 줄의 텍스트를 출력하는 내장 서버를 디버깅하고 있습니다. 스트림 어디에도 개행 문자는 없지만 텍스트 데이터이므로 출력 시 형식을 지정하고 싶습니다. 스트림의 문자를 유효한 개행 문자로 바꾸기 위해 tr(번역)을 사용해 보았지만 항상 개행 문자로 적절하게 대체할 수 있는 유일한 단일 문자를 찾는 것은 불가능했습니다. 내 초기 생각은 sed를 사용하여 2-3 문자 패턴에 줄 바꿈을 추가하는 것이었지만 sed는 줄 기반이고 스트림은 끝없는 단일 줄이므로 sed는 프로세스를 완료하지 않습니다! sed에 대한 비라인 기반 대안이 있습니까?

답변1

fold목적 은 다음과 같습니다 .

NAME
       fold - wrap each input line to fit in specified width

SYNOPSIS
       fold [OPTION]... [FILE]...

DESCRIPTION
       Wrap input lines in each FILE, writing to standard output.

       With no FILE, or when FILE is -, read standard input.

       Mandatory  arguments  to  long options are mandatory for short options
       too.

       -b, --bytes
              count bytes rather than columns

       -s, --spaces
              break at spaces

       -w, --width=WIDTH
              use WIDTH columns instead of 80

       --help display this help and exit

       --version
              output version information and exit

위에서 볼 수 있듯이 너비를 기준으로 줄을 축소하여 100개의 문자 줄을 얻습니다.

command_that_reads_from_port | fold -w 100

이는 GNU coreutils의 일부인 표준 프로그램이므로 모든 GNU 시스템에 있어야 합니다.

답변2

해결책은 다음과 같습니다

stdbuf -o0 ncat -ul 51002 | stdbuf -o0 fold | sed "s/\[15/\&\[15/g" -u | stdbuf -o0 tr -d '\n' | tr "&" "\n"

여기서 [15는 앞에 개행 문자를 추가하려는 패턴입니다. 약간의 해결 방법이지만 훌륭하게 작동합니다.

답변3

게시한 답변에 따르면 다중 문자 RS 및 RT에 GNU awk를 사용하면 다음과 같은 내용이 필요할 수 있습니다.

$ printf '%s' 'foo[15bar[15and stuff' |
    awk -v RS='[[]15' '{print pRT $0; pRT=RT}'
foo
[15bar
[15and stuff

그러나 샘플 입력/출력이 없으면 이는 추측입니다. awk 스크립트 내의 데이터에 대해 원하는 모든 작업을 수행할 수 있으며, [15특정 수의 구분된 레코드 또는 특정 문자 수 이후에 데이터 처리를 중지하려면 단순히 개수를 추가하고 종료하면 됩니다. 20 녹음 후 종료:

awk -v RS='[[]15' '{print pRT $0; pRT=RT} NR==20{exit}'

또는 1000자 이후:

awk -v RS='[[]15' '{$0=pRT $0; n+=length(); print; pRT=RT} n==1000{exit}'

아니면 당신이 좋아하는 것.

필요에 따라 stdbuf 섹션을 추가하십시오.

관련 정보