sed를 사용하여 연속 스트림 출력을 작동하는 방법은 무엇입니까?

sed를 사용하여 연속 스트림 출력을 작동하는 방법은 무엇입니까?

저는 기술 지식이 없는 청중을 위한 프레젠테이션을 준비하고 있습니다. 연속적인 값 스트림을 출력하는 bash에서 실행되는 프로그램이 있는데 그 중 일부는 중요합니다. 청중이 그 빈도를 이해할 수 있도록 표시된 중요한 결과를 강조하고 싶습니다. 문제는 sed실행 중인 스트림에서 작업을 수행할 수 없다는 것입니다. 결과를 다음과 같은 파일에 넣으면 훌륭하게 작동합니다.

cat output.txt | sed "s/some text/some text bolded/"

그러나 다음과 같이 실행 출력에 대해 동일한 작업을 시도하면:

command | sed "s/some text/some text bolded/"

sed아무것도 하지 않았습니다. 어떤 아이디어가 있나요?

Lambert가 유용하게 지적했듯이 " sed아무것도 하지 않는다"는 나의 진술은 모호합니다. 무슨 일이 일어나는지는 프로그램이 stdout파이프로 연결되어 있음에도 불구하고 정상적으로 출력된다는 것입니다(쓰지 않을 것이라고 확신합니다).stderrsed

문제는 명령이 두 번째 프로그램을 호출한 다음 표준 출력으로 출력한다는 것입니다. 첫 번째 프로그램은 내가 편집할 수 있는 몇 줄을 인쇄합니다. 그런 다음 두 번째 프로그램에서 인쇄된 값의 스트림이 있습니다. 이러한 값은 편집할 수 없습니다.

Perl 및 awk 메소드도 작동하지 않습니다.

답변1

명령의 출력이 버퍼링될 가능성이 높습니다. 명령이 터미널에 기록되면 버퍼는 줄 바꿈할 때마다 플러시되므로 예상 속도로 나타나는 것을 볼 수 있습니다. 명령이 파이프에 기록되면 버퍼는 몇 킬로바이트에 도달할 때만 플러시되므로 지연이 많이 발생합니다. 이는 표준 입력/출력 라이브러리의 기본 동작입니다.

명령이 출력에 영향을 주지 않도록 하려면 unbuffer(예상에서) 또는 stdbuf(GNU coreutils에서)를 사용할 수 있습니다.

unbuffer command | sed …
stdbuf -o0 command | sed …

답변2

sed옵션이 있습니다:

-u, --버퍼링 없음

입력 파일에서 최소한의 데이터를 로드하고 출력 버퍼를 더 자주 플러시합니다. man sed자세한 내용은 참조하십시오 .

답변3

나는 awk를 사용할 것이다

  command | awk '/some important stuff/ { printf "%c[31m%s%c[0m\n",27,$0,27 ; next }
  { print ; } '

어디

  • /some important stuff/sed와 같이 중요한 줄을 선택하세요.
  • printf "%c[31m%s%c[0m\n",27,$0,27 ;빨간색으로 인쇄
    • 녹색, 노란색에는 32,33을 사용하십시오.
    • $1, $2는 특정 필드를 선택하는 데 사용할 수 있습니다.
  • 다른 줄은 "있는 그대로" 인쇄됩니다.

중요한 점은 command행을 플러시해야 한다는 것입니다. 하지만 출력량이 많은 경우에는 이렇게 해야 합니다.

답변4

펄 방식:

command | perl -pe 's/(stuff)/\x1b[1m$1\x1b[0m/g'

또는 연속 출력:

bash 스크립트 출력 cont:

#!/bin/bash
while [ true ]
do
   echo "Some stuff"
done

시험:

./cont | perl -pe 's/(stuff)/\x1b[1m${1}\x1b[0m/g'
  • \x1b[1m- 대담하게 표현하거나 강렬함을 더해보세요.
  • ${1}- 역참조
  • \x1b[0m-모든 속성을 재설정합니다.

산출:

일부물건
일부물건
일부물건
일부물건

추가 이스케이프 코드여기.

관련 정보