[1189060]Я справился с этим немного по-другому. Я поддерживаю статическую конфигурацию iptables, которая имеет переходы на специальные (изначально пустые) цепочки.
Затем я обновляю эти специальные цепочки асинхронно через задание cron. Вы можете зациклиться на вторичном источнике данных, который имеет только ip адреса/имена хостов, а также прошивать и обновлять цепочку каждые N минут (или лучше, не прошивать и не удалять устаревшие правила...)
Это немного изолирует iptables вашей системы, уменьшая область редактирования автоматизации.
Примечание: Вы можете редактировать активные правила одним из двух способов:
Если вы используете линейку, вы дамп правил и выбираете номер правила, исходя из его номера. ВНИМАНИЕ! В этом есть неотъемлемое состояние гонки! Если вы указываете спецификацию правила, вы просто указываете все те же параметры, что и правило, и оно будет выбрано для удаления.[1189069].
Тебе не нужна кошка
. sed
счастливо принимает имя файла в качестве аргумента:
sed 's/^ *//' <file>
Если вы используете GNU sed, вы можете использовать переключатель -i
или -в месте
, чтобы редактировать
файл на месте:
sed -i 's/^ *//' <file>
Чтобы ответить на вопрос, можно добиться "полной буферизации файлов" с помощью инструмента
губка
из упаковки moreutils . Используя
губка
можно сделать:
<command> <file> | sponge <file> # or
<command1> < <file> | <command2> | sponge <file>
Используя Ваш sed
пример, это становится:
sed 's/^ *//' <file> | sponge <file>
Вы смотрели на команду буфера Linux? Это использует пользовательский сегмент памяти в основном допустить одновременное чтение / пишет. Я полагаю, что он может буфер целый файл, если общий сегмент памяти достаточно большой.
Команда буфера может быть не установлена автоматически, но я нашел программу во многих репозиториях на разных дистрибутивах Linux. В худшую сторону вы можете Google и найти источник и компилировать / ссылку сами.
Я использовал буфер для ускорения пишет, чтобы медленные устройства, такие как ленточные накопители, и он снижает время передачи около 10-20%.
Еще одна вероятность, чтобы поставить все содержимое файла в переменную оболочки. Раньше был предел на размере, но я понимаю, что это больше не проблема. Пока у вас есть память (конечно, превышающая физическую память, вызовет замену), вы можете попробовать следующее:
Например:
varx=`cat filename`
echo "$varx" | sed ..... >$filename
Я только упоминаю об этом в случае, если вы можете так что-то, кроме команды SED Отказ
Не бесполезное использование команды CAT. Используйте SED непосредственно для распечатки содержимого или использования --i
, чтобы сделать в месте редактирования.
Вы просто должны использовать -I
GNU) SED , так
sed -i -r 's/^ *//' file_to_replace_in_place.txt
и для OS X:
sed -i.'' -r 's/^ *//' file_to_replace_in_place.txt
Другое (более общее) решение состоит в том, чтобы использовать TEE :
cat file | sed 's/^ *//' | tee file
Вы должны заботиться о огромных файлах Это может выйти без ошибок, ни изменения.
Вы можете использовать Vim в режиме Ex:
ex -sc '%s/^ *//|x' file1.txt
%
выберите все строки
s
заменить
x
сохранить и закрыть