Существует ли способ сделать “полный файл, буферизующий” в цепочке переданных по каналу команд?

[1189060]Я справился с этим немного по-другому. Я поддерживаю статическую конфигурацию iptables, которая имеет переходы на специальные (изначально пустые) цепочки.

Затем я обновляю эти специальные цепочки асинхронно через задание cron. Вы можете зациклиться на вторичном источнике данных, который имеет только ip адреса/имена хостов, а также прошивать и обновлять цепочку каждые N минут (или лучше, не прошивать и не удалять устаревшие правила...)

Это немного изолирует iptables вашей системы, уменьшая область редактирования автоматизации.

Примечание: Вы можете редактировать активные правила одним из двух способов:

Built-in editor

Если вы используете линейку, вы дамп правил и выбираете номер правила, исходя из его номера. ВНИМАНИЕ! В этом есть неотъемлемое состояние гонки! Если вы указываете спецификацию правила, вы просто указываете все те же параметры, что и правило, и оно будет выбрано для удаления.[1189069].

1
04.12.2014, 03:58
6 ответов

Тебе не нужна кошка . 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>
4
27.01.2020, 23:17

Вы смотрели на команду буфера Linux? Это использует пользовательский сегмент памяти в основном допустить одновременное чтение / пишет. Я полагаю, что он может буфер целый файл, если общий сегмент памяти достаточно большой.

Команда буфера может быть не установлена ​​автоматически, но я нашел программу во многих репозиториях на разных дистрибутивах Linux. В худшую сторону вы можете Google и найти источник и компилировать / ссылку сами.

Я использовал буфер для ускорения пишет, чтобы медленные устройства, такие как ленточные накопители, и он снижает время передачи около 10-20%.

1
27.01.2020, 23:17

Еще одна вероятность, чтобы поставить все содержимое файла в переменную оболочки. Раньше был предел на размере, но я понимаю, что это больше не проблема. Пока у вас есть память (конечно, превышающая физическую память, вызовет замену), вы можете попробовать следующее:

Например:

 varx=`cat filename`
 echo "$varx" | sed ..... >$filename

Я только упоминаю об этом в случае, если вы можете так что-то, кроме команды SED Отказ

0
27.01.2020, 23:17

Не бесполезное использование команды CAT. Используйте SED непосредственно для распечатки содержимого или использования --i , чтобы сделать в месте редактирования.

0
27.01.2020, 23:17

Вы просто должны использовать -I GNU) , так

sed -i -r 's/^ *//' file_to_replace_in_place.txt 

и для OS X:

sed -i.'' -r 's/^ *//' file_to_replace_in_place.txt 

Другое (более общее) решение состоит в том, чтобы использовать :

cat file | sed 's/^ *//' | tee file

Вы должны заботиться о огромных файлах Это может выйти без ошибок, ни изменения.

0
27.01.2020, 23:17

Вы можете использовать Vim в режиме Ex:

ex -sc '%s/^ *//|x' file1.txt
  1. % выберите все строки

  2. s заменить

  3. x сохранить и закрыть

0
27.01.2020, 23:17

Теги

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