Проблема с вашим решением заключается в том, что вы вызываете grep
для каждой строки. На самом деле, grep также анализирует каждую строку. Таким образом, для файла с n строками эти строки анализируются n^2 раз, а загрузка grep
— довольно затратный вызов.
Используйте однострочный буфер -, в этом примере называемый PrevLine
, например:
#!/bin/bash
CurLine=''
isFirstLine=true
while IFS='' read -r LineBelow; do
if $isFirstLine; then
echo "This is the first line, so no previous."
else
echo "Current line read: ${CurLine}"
echo "Line below: ${LineBelow}"
fi
CurLine="${LineBelow}"
isFirstLine=false
done <"$1"
На самом деле присвоение true
к isFirstLine
— это присваивание строки, а простое упоминание$isFirstLine
(в условии if -)— это выполнение команды этой строки. Поскольку true
и false
являются встроенными в bash -, их можно использовать напрямую без существенного влияния на скорость, но с большим увеличением читабельности.
В последней строке упоминается $1
как имя входного файла, поэтому вызовите с помощью:
./test.sh inputfile.txt
Нет переключателя во время выполнения :вы переключаетесь между SLAB и SLUB (и если вы включаете режим EXPERT, SLOB)путем перекомпиляции ядра. Эта опция находится в «Общие настройки -> Выбрать распределитель SLAB».
Я не нашел никаких причин для изменения значения по умолчанию, но ответ на этот предыдущий вопрос SE указывает на то, что причин для использования SLAB, вероятно, мало или вообще нет.