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
Цикл 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
Вы многократно открываете и закрываете один и тот же файл (возможно, сотни раз). Старайтесь открывать каждый файл не более одного раза.
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
Это тот же совет, что и перенаправление всего цикла вместо перенаправления конкретной команды в цикле.