다음은 데이터베이스를 JSON으로 덤프하고 Debian wheezy와 잘 작동하는 소스 파일입니다.
#!/bin/sh
echo "Status: 200"
echo
echo {
printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | while IFS=, read col1 col2
do
if [ "$col2" = "true" -o "$col2" = "false" ]
then
echo "\"$col1\" : $col2,"
else
case $col2 in
*['"']* ) col2=$(echo $col2 | sed 's/\"//g') ;;
esac
echo "\"$col1\" : \"$col2\","
fi
done
echo "\"ZZZZZ\" : \"\""
echo }
Debian Stretch용으로 업데이트해야 하는데 원치 않는 캐리지 리턴이 발생합니다. 문제 없습니다. 문제를 해결했고 이 버전에서는 올바른 출력을 얻었습니다.
#!/bin/sh
echo "Status: 200"
echo
echo {
printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | while IFS=, read col1 col2
do
col2=`echo "$col2" | sed 's/.$//'`
if [ "$col2" = "true" -o "$col2" = "false" ]
then
echo "\"$col1\" : $col2,"
else
case $col2 in
*['"']* ) col2=$(echo $col2 | sed 's/\"//g') ;;
esac
echo "\"$col1\" : \"$col2\","
fi
done
echo "\"ZZZZZ\" : \"\""
echo }
문제는 올바른 버전이 매우 느리다는 것입니다(데이터베이스는 크지 않지만 내 하드웨어는 제한되어 있습니다). 첫 번째 버전은 약 300밀리초 안에 실행되고 두 번째 버전은 6초 안에 실행됩니다. 실행 속도를 높이려면 무엇을 변경해야 합니까?
감사해요!
답변1
실행으로 인해 성능 문제가 발생할 수 있습니다.
col2=`echo "$col2" | sed 's/.$//'`
각 행마다. 참고: 캐리지 리턴이 아니더라도 각 줄의 마지막 문자를 제거합니다. 나는 사용하는 것이 좋습니다sed 's/\r$//'
전체 출력에 대해 이 작업을 수행할 수 있습니다.
printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | sed 's/\r$//' | while IFS=, read col1 col2
모든 문자를 제거 '\r'
하고 줄 중간에 나타날 수 있는 문자를 유지하지 않으려는 경우에도 tr -d '\r'
바꾸기를 사용할 수 있습니다 sed 's/\r$//'
.
답변2
새 버전이 sed
모든 라인에서 호출되고 있습니다. tr
초기 명령에서 제거 CR을 한 번만 호출하면 이를 방지 할 수 있습니다 .
printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | tr -d '\r' | while IFS=, read col1 col2