Grep данные и вывод в файл - PullRequest
       38

Grep данные и вывод в файл

2 голосов
/ 15 сентября 2011

Я пытаюсь извлечь данные из файлов журнала и систематизировать их.У меня есть около 9 файлов журналов размером ~ 100 МБ каждый.

Я пытаюсь сделать следующее: извлечь несколько кусков из каждого файла журнала, и для каждого извлеченного блока я хотел бы создать новый файл и сохранить в нем эти извлеченные данные,У каждого блока есть четкая начальная и конечная точка.

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

Я не могу использовать такой язык программирования, как Python или Perl, из-за ограничений моей среды.Поэтому, пожалуйста, извините грязную команду.

Моя команда на данный момент:

find Logs\ 13Sept/Log_00000000*.log -type f -exec \
sed -n '/LRE Starting chunk/,/LRE Ending chunk/p' {} \; | \
grep -v -A1 -B1 "Starting chunk" > Logs\ 13Sept/Chunks/test.txt

LRE Starting chunk и LRE Ending chunk - мои границы.Сейчас моя команда работает, но она сохраняет все совпавших кусков в один файл (размер которого становится чрезмерным).

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

Ответы [ 4 ]

2 голосов
/ 15 сентября 2011

Вероятно, нужно что-то более программируемое, чем sed: я предполагаю, что awk доступен.

awk '
    /LRE Ending chunk/ {printing = 0}
    printing {print > "chunk" n ".txt"}
    /LRE Starting chunk/ {printing = 1; n++}
' *.log
1 голос
/ 15 сентября 2011

Что-то вроде этого возможно?

find Logs\ 13Sept/Log_00000000*.log -type f -exec \
sed -n '/LRE Starting chunk/,/LRE Ending chunk/{;/LRE .*ing chunk/d;w\
'"{}.chunk"';}' {} \;

Используется команда sed w для записи в файл с именем (inputfile) .chunk. Если это неприемлемо, возможно, вы можете использовать sh -c '...' для передачи небольшого сценария оболочки, чтобы обернуть команду sed. (Или сценарий оболочки по какой-то причине также запрещен?)

1 голос
/ 15 сентября 2011

Попробуйте что-то вроде этого:

find Logs\ 13Sept/Log_00000000*.log -type f -print | while read file; do \
sed -n '/LRE Starting chunk/,/LRE Ending chunk/p' "$file" | \
grep -v -A1 -B1 "Starting chunk" > "Logs 13Sept/Chunks/$file.chunk.txt";
done

Это циклически повторяет результаты поиска и выполняется для каждого файла, а затем создает один файл $ file.chunk.txt для каждого из файлов.

0 голосов
/ 15 сентября 2011

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

...