Производительность сценария Bash

bash

IFS=, read -r -a fields <<< "$date"
results=()
for keyval in "${fields[@]}"; do 
    IFS='=' read -r key value <<< "$keyval"
    case $key in 
        srcip|srczone|protocol|dstip|dstzone|dstport|rule_name) results+=("$keyval")
    esac
done
(IFS=,; echo "${results[*]}")
srcip=1.1.1.1,srczone=internal,protocol=6,dstip=2.2.2.2,dstport=80,dstzone=external,rule_name=Deny_All
1
25.11.2016, 13:13
2 ответа

Цикл Bash в вашем случае очень медленный:

> cat test-1.sh
#!/bin/sh

i=0
a='fixedstring1'
b='fixedstring2'


while [ $i -lt ${1:-9} ]; do
  ur="$a""$b""$i"
  echo $ur
  (( i++ ))
done

> time sh test-1.sh 999999 | wc -l
...
real    1m11.488s

А использование jot (или seq ) делает его намного быстрее:

> cat test-3.sh
#!/bin/sh

a='fixedstring1'
b='fixedstring2'

jot -w "$a$b" ${1:-9}
# seq -f "$a$b%g" ${1:-9}
> time sh test-3.sh 999999 | wc -l
...
real    0m0.613s

И какова логика разделения чисел подать? Если это простое ограничение количества строк, вы можете использовать команду split (сейчас я имею в виду GNU split из-за использования параметра -d ):

sh test-3.sh | split -d -l "how much lines in one file" - expr1/file
3
27.01.2020, 23:25

Вы многократно открываете и закрываете один и тот же файл (возможно, сотни раз). Старайтесь открывать каждый файл не более одного раза.

i=0
a='fixedstring1'
b='fixedstring2'
m=0

exec 3>exp1/file$m

while [[ $i -le 9999999 ]]; do
    ur="$a$b$i"
    if ... # m changes
    then
        exec 3>exp1/file$m
    fi
    echo $ur >&3
    (( i++ ))
done

Это тот же совет, что и перенаправление всего цикла вместо перенаправления конкретной команды в цикле.

1
27.01.2020, 23:25

Теги

Похожие вопросы