3

В среде Linux, у меня есть программа, которая создает большой файл (2-3 ГБ). Мне нужно отфильтровать этот файл (например, я хочу удалить строку, если она появляется в предыдущих 10 строках). Я хочу сделать это во время работы программы и без создания нового файла.

Если программа направляет вывод в стандартный вывод вместо файла, это можно легко решить с помощью конвейера (prgram1 | filter_program> file). Но это не так.

Есть ли способ сделать это?

1 ответ1

2

mkfifo

Вы можете сделать так, чтобы ваша первая программа записывала в fifo (именованный канал) вместо обычного файла, затем вы можете обрабатывать вывод так, как вам нравится, как в обычном канале:

mkfifo out
prgram1 -O out | filter_program < out  > file
rm out

Например, с помощью wget в качестве prgram1 вы можете сделать:

wget -qO out 'superuser.com' | grep '<title>' out

| просто служит для запуска обеих команд одновременно, сам канал не используется.

Программа должна записывать файл последовательно, чтобы это работало. Если это нужно переместить файл, который не будет делать.


Редактировать: Это не работает, если программа удаляет выходной файл перед записью.

Нам нужно больше хитрости тогда. Как насчет того, чтобы позволить программе писать, но не удалять файл :

$ prg1() { rm out; wget -qO out 'superuser.com'; }
$ mkfifo out
$ chmod 500 .
$ prg1 | grep '<title>' out

Это должно работать, пока программа не слишком суетливая и не выдает ошибку при неудачном удалении.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .