我编写了一个 SQL 迁移脚本,用于替换 MySQL 转储文件中的文本。使用 替换起来很容易sed
,但我们必须考虑特殊序列化(PHP 序列化)。下面的代码可以工作,但awk
命令非常昂贵。通过快速谷歌搜索,我看到许多开发人员使用相同的运行时性能问题。本文详细说明了简单的更改如何产生巨大的影响。如果有人知道我如何加快此命令的速度,或者更快的替代方案,那就太棒了 :)
#!/usr/bin/env bash
set -e
SQL_FILE="$1"
maindomain="$2"
localdomain="$3"
sed 's/;s:/;\ns:/g' "$SQL_FILE" | \
awk -F'"' '/s:.+'$maindomain'/ {sub("'$maindomain'", "'$localdomain'"); n=length($2)-1; sub(/:[[:digit:]]+:/, ":" n ":")} 1' | \
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' | \
sed "s/$maindomain/$localdomain/g" > "$SQL_FILE.txt"
rm "$SQL_FILE"
mv "$SQL_FILE.txt" "$SQL_FILE"
答案1
awk
我上面遇到的问题通过更新(MacOS 12.6 (21G115))上的库得到解决。运行上述问题陈述中显示的命令后,出现了显著的改进。brew install cgrep
从brew install gawk
到~awk -F'"' '/s:.+'$maindomain'/ {sub(...
3-5 minutes
sys 0m0.039s.
我不需要将awk
命令更改为cgrep
或gawk
。