저는 기술 지식이 없는 청중을 위한 프레젠테이션을 준비하고 있습니다. 연속적인 값 스트림을 출력하는 bash에서 실행되는 프로그램이 있는데 그 중 일부는 중요합니다. 청중이 그 빈도를 이해할 수 있도록 표시된 중요한 결과를 강조하고 싶습니다. 문제는 sed
실행 중인 스트림에서 작업을 수행할 수 없다는 것입니다. 결과를 다음과 같은 파일에 넣으면 훌륭하게 작동합니다.
cat output.txt | sed "s/some text/some text bolded/"
그러나 다음과 같이 실행 출력에 대해 동일한 작업을 시도하면:
command | sed "s/some text/some text bolded/"
sed
아무것도 하지 않았습니다. 어떤 아이디어가 있나요?
Lambert가 유용하게 지적했듯이 " sed
아무것도 하지 않는다"는 나의 진술은 모호합니다. 무슨 일이 일어나는지는 프로그램이 stdout
파이프로 연결되어 있음에도 불구하고 정상적으로 출력된다는 것입니다(쓰지 않을 것이라고 확신합니다).stderr
sed
문제는 명령이 두 번째 프로그램을 호출한 다음 표준 출력으로 출력한다는 것입니다. 첫 번째 프로그램은 내가 편집할 수 있는 몇 줄을 인쇄합니다. 그런 다음 두 번째 프로그램에서 인쇄된 값의 스트림이 있습니다. 이러한 값은 편집할 수 없습니다.
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
-모든 속성을 재설정합니다.
산출:
일부물건
일부물건
일부물건
일부물건
추가 이스케이프 코드여기.