这是我的源文件,它将数据库转储为 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