백그라운드에서 약 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
\ .?0
0$
(이것은 문제가 되지 않습니다 less -R
).