Одна из самых недооцененных идей - это избегать лишних вызовов внешних утилит. Каждый grep, sed, awk, cut, wc - это новый процесс. Даже если он работает миллисекунды, то в большом цикле таких вызовов может быть сотни, и производительность падает кратно.
▪️ Примеры оптимизации
➖ Было:
count=$(grep "error" logfile | wc -l)
➕ Стало:
count=$(awk '/error/{c++} END{print c}' logfile)
или вообще без внешних утилит:
count=0
while IFS= read -r line; do
[[ $line == *error* ]] && ((count++))
done < logfile
➖ Было:
name=$(echo "$filename" | cut -d. -f1)
➕ Стало:
name=${filename%%.*}
расширение строк - это встроенная возможность bash, без cut
➖ Было:
for f in $(ls *.log); do
grep "fatal" "$f" >/dev/null && echo "$f"
done
➕ Стало:
for f in *.log; do
grep -q "fatal" "$f" && echo "$f"
done
не вызываем ls, здесь glob уже делает свою работу
▪️ Фичи встроенного bash
${var,,} и ${var^^}- lowercase / uppercase без tr${var//foo/bar}- замена без sed${#array[@]}- длина массива без wc[[ $var == pattern* ]]- шаблоны без grep((expr))- арифметика без expr или bcmapfile -t lines < file- чтение файлов без cat
BashTex 📱 #bash