Поскольку у вас есть два состояния, что наличие двух разных строк смещения между ними - задача для awk (или perl, или python). Поскольку мой текущий язык - python, программа будет выглядеть так:
import sys
rule_file = sys.argv[1]
new_rules = sys.argv[2]
mode = "save_rules"
for line in open(rule_file):
line = line.strip()
if line == "#start":
print line
print new_rules
mode = "replace_rules"
elif line == "#end":
mode = "save_rules"
print line
elif mode == "save_rules":
print line
Теперь сохраните это в rule_replace.py и вызовите его с помощью
python rule_replace.py my_rule_file.txt 'FirewallRuleSet global {
FirewallRule allow tcp to google.com
FirewallRule deny tcp to facebook.com
FirewallRule deny tcp to twitter.com
FirewallRule allow tcp to exaple.com
#more rules
}' >new_rules.txt
. Конечно, вам не нужно помещать новые правила в командную строку, я предполагаю, что вы будет иметь их в переменной оболочки, и тогда вызов будет выглядеть так:
$ python rule_replace.py my_rule_file.txt $new_rules
Обратите внимание, что этот сценарий, хотя он работает, не является решением для чего-то в производстве. Он не обнаруживает никаких ошибок (например, если нет исходного файла). Он предполагает, без проверки, что за строкой #start всегда следует строка #end и что строки точно такие, как вы описали. Он также может использовать некоторое ведение журнала, если будет запущен в производство.
Резюме комментариев: Машина быстрая, но не имеет достаточно памяти для параллельной работы. Кроме того, задача требует чтения большого количества данных, а пропускной способности диска недостаточно, поэтому процессоры простаивают большую часть времени в ожидании данных.
Перегруппировка задач помогает.
Еще не исследовали сжатие данных, чтобы узнать, может ли оно улучшить эффективную пропускную способность дискового ввода-вывода.
Начиная с версии 20160422, вы можете:
## Solve in PARALLEL
parallel {1} -m {2} -o {3} --timeout 3600 ::: "${METHODS[@]}" :::+ "${INFILES[@]}" :::+ "${OUTFILES[@]}"
Если у вас более старая версия:
## Solve in PARALLEL
parallel --xapply {1} -m {2} -o {3} --timeout 3600 ::: "${METHODS[@]}" ::: "${INFILES[@]}" ::: "${OUTFILES[@]}"
Потратьте час на изучение man parallel_tutorial
. Ваша командная строка полюбит вас за это.