런타임 시 스크립트 출력 필터링

런타임 시 스크립트 출력 필터링

백그라운드에서 약 10개의 다른 스크립트를 실행하여 지속적으로 새로운 출력을 생성하는 스크립트가 있습니다. 초기 스크립트를 계속 실행하고 이를 입력하여 터미널에 표시되는 모든 출력을 실시간으로 필터링하고 싶습니다.

단순화를 위해 각 for 루프가 배경 스크립트 중 하나를 나타낸다고 가정하겠습니다(출력에는 색상 코드가 포함됩니다).

for i in {0..1000} ; do
    echo -e "\033[0;31mHello world\033[0m $i"
    sleep 1
done &


for i in {0..1000} ; do
    echo -e "\033[0;34mHello world\033[0m $i"
    sleep 1
done &

내 첫 번째 아이디어는 백그라운드 스크립트의 모든 출력을 파일로 리디렉션한 다음 명령을 사용하여 read검색 쿼리를 가져와 다음 grep과 같이 전달하는 것이었습니다.

for i in {0..1000} ; do
    echo -e "\033[0;31mHello world\033[0m $i"
    sleep 1
done >> ./output.txt 2>&1 &

for j in {0..1000} ; do
    echo -e "\033[0;34mHello world\033[0m $j"
    sleep 1
done >> ./output.txt 2>&1 &

while true ; do
    read -p "Search: " query
    clear
    cat ./output.txt | grep "$query"
done

그러나 몇 가지 문제가 있습니다.

질문 업데이트: 파일이 변경되면 출력이 업데이트되지 않습니다 output.txt. 따라서 최신 결과를 얻으려면 계속해서 검색해야 합니다.

색상 코드 문제: 검색하면 3색상 코드에 포함된 모든 줄이 인쇄됩니다 3. 물론 다음과 같이 색상을 완전히 필터링할 수 있지만 cat ./output.txt | sed 's/\x1b\[[0-9;]*m//g' | grep "$query"최종 출력에서 ​​색상을 잃고 싶지 않으므로 쉽지 않습니다.

입력이 사라지는 문제: 검색을 위해 Enter 키를 누른 후 실시간으로 새 출력을 인쇄하더라도 사용자는 다음 검색어를 올바르게 입력(더 정확하게는 볼 수 없음)할 수 없습니다. 사용자가 입력한 필터링된 텍스트가 항상 표시되도록 하고 싶습니다.

이것을 달성하는 방법에 대한 아이디어가 있습니까?

답변1

less -R

less뷰어 를 이용하시면 됩니다

  • 옵션을 사용하여 ANSI 색상 보기-R
  • 앞으로 검색 pattern하다/pattern
  • pattern다음으로 뒤로 검색?pattern

  • 탐색하려면 arrow키와 PgUp, PgDn, 를 사용하십시오 .HomeEnd


  • 키를 누르면 버퍼가 업데이트됩니다 End. :-)
  • 색상 코딩 문제가 해결되었습니다.
  • 입력이 사라지지 않습니다.

다음 스크립트를 사용하여 작성하세요.

#!/bin/bash

for i in {0..1000} ; do
    echo -e "\033[0;31mHello world\033[0m $i"
    sleep 1
done >> output.txt 2>&1 &

for j in {0..1000} ; do
    echo -e "\033[0;34mHello world\033[0m $j"
    sleep 1
done >> output.txt 2>&1 &

읽기/확인하려면 이 명령줄을 사용하세요.

less -R output.txt

fifo, tail및 가 포함된 쉘 스크립트grep

간단한 명령 less의 대안 은 다음과 같은 작은 쉘 스크립트입니다. 이는 터미널 창에서 이전 출력을 볼 수 있을 만큼 충분히 스크롤할 수 있다고 가정합니다. 버퍼가 충분히 크지 않으면 버퍼를 늘릴 수 있습니다. 내 ".bashrc"에는 이 목적을 위해 원하는 대로 수행할 수 있는 다음 줄이 있습니다.

HISTFILESIZE=1000000
HISTSIZE=10000

필터링 및 검사를 위한 쉘스크립트,

#!/bin/bash

# this function is called when Ctrl-C is sent ##########################

inversvid="\0033[7m"
resetvid="\0033[0m"

function trap_ctrlc ()
{
    # perform cleanup here

    echo " Press <Enter> to continue with another query or"
    echo -en "$inversvid"
    read -s -n1 -t5 -p " <x> to exit " ans
    echo -en "$resetvid"
    if [ "$ans" == "x" ]
    then
     # exit shell script
     # if omitted, shell script will continue execution
     echo ""
     exit
    else
     echo ""
    fi
}

##### main #############################################################

# initialise trap to call trap_ctrlc function
# when signal 2 (SIGINT) is received

trap "trap_ctrlc" 2

echo "Scroll the terminal window (maybe inscrease the buffer to store enough lines)

Interrupt viewing the filtered output with <ctrl c>"

if [ "$1" == "" ]
then
   read -p "Search: " query
else
   query="$@"
fi

# create fifo

mkfifo fifo

# run a loop for queries and filtered output

while true ; do
 if [ "$query" == "" ]
 then
    read -p "New search: " query
 fi

# mkfifo fifo
 clear
 tail -n 10000 -f output.txt > fifo &
 grep --color -E "$query" fifo
 sleep 0.1
 query=""
done

이 쉘스크립트는 ANSI 이스케이프 시퀀스도 볼 수 있으므로 예를 들어 필터링하려는 경우 0모든 행을 볼 수 있습니다(재설정 시퀀스에 0이 있기 때문입니다). 또는 와 같이 검색할 항목을 지정하는 -E옵션 과 함께 확장 정규식을 사용할 수 있습니다 .grep\ .?00$

(이것은 문제가 되지 않습니다 less -R).

관련 정보