Возникла необходимость изменения некоторых параметров в файле большого размера (дамп базы данных больше трех гигабайт). Редакторы отпадают (слишком тяжело им "ворочать" таким обьемом данных), но для интереса попробовал с помощью таких редакторов:
- joe - выпадал в корку (не хватало места в /tmp, размером 2 GB)
- mcedit - ругался при запуске, что "файл слишком большой"
- ee - "немного задумавшись" открыл файл, довольно шустро работал с поиском. Но вот замены что-то не обнаружил (не юзаю я этот редактор, а разбираться как-то неохота)
- vi - также "задумчиво" открыл файл. Замену произвел с помощью команды ":g/old_text/s//new_text/g<ENTER>". Запись файла по команде ":wq" также заняла довольно продолжительное время. Но отработалось
Для решения подобной задачи все таки лучше использовать другие способы. Итак, исходные данные:
# cat example.txt I have two powerfull laptops. |
Заменим строку "laptops" на "servers" несколькими способами.
Способ 1. Замена подстроки в одном файле с помощью sed
# sed -e 's/laptops/servers/g' example.txt > example_new.txt I have two powerfull servers. |
Способ 2. Замена подстроки в одном файле с помощью perl
# perl -e 's/laptops/servers/g' -pi example.txt |
Способ 3. Замена подстроки с помощью awk
# awk '{gsub("laptops", "servers", $0); print > FILENAME}' example.txt |
Теперь отсортируем выводы по ресурсоемкости операций (использовалась утилита time, замена использовалась для файла размером 2.3GB)
Способ 1
10.915u 9.029s 2:35.01 12.8% 37+1490k 14962+18828io 0pf+0w |
Способ 2
7.445u 9.400s 2:52.98 9.7% 5+1503k 19574+18828io 0pf+0w |
Способ 3
0.000u 0.077s 0:00.42 16.6% 154+1332k 9+0io 9pf+0w |
Информация для размышлений предоставлена, а необходимый результат достигнут.