2015-07-19 2 views
1

Итак, я использую Willie около 8 месяцев, и он записывает raw.log всего, что происходит в канале IRC, в котором он запускается. Теперь проблема заключается в том, что он записывает много ненужных, ну , раздувание.Как обрезать огромный текстовый файл?

Вот пример:

<<1419986827.01 :[email protected] NICK Snoo62763 
>>1419986827.04 PRIVMSG Snoo62763 :TypeError: not all arguments converted during string formatting (file "C:\Python27\willie\willie\coretasks.py", line 254, in track_nicks) 
<<1419986827.12 :[email protected] PRIVMSG Snoo62763 :TypeError: not all arguments converted during string formatting (file "C:\Python27\willie\willie\coretasks.py", line 254, in track_nicks) 
<<1419986827.22 :[email protected] NOTICE Snoo62763 :Welcome to Snoonet, Snoo62763! Here on Snoonet, we provide services to enable the registration of nicknames and channels! For details, type /msg NickServ help and /msg ChanServ help. 
<<1419986832.84 :[email protected]/venn177 PRIVMSG #RLB :uh, well, this seems to work 
<<1419986832.84 :[email protected]/venn177 PRIVMSG #RLB :in any case, let's try this 
>>1419986852.92 QUIT :KeyboardInterrupt 
>>1419986861.61 CAP LS 
>>1419986861.61 NICK BotSelig 
>>1419986861.62 USER willie +iw BotSelig :Willie Embosbot, http://willie.dftba.net 
<<1419986861.67 :veronica.snoonet.org NOTICE Auth :*** Looking up your hostname... 

Так из всего этого, единственное, что я хочу, чтобы это текст, который происходит после «#RLB:». Я хотел бы сохранить каждую строку «текста» на своей собственной линии, но вырезать весь этот ненужный пух. Итак, как я мог что-то прочитать в каждой строке текстового файла, проверить, есть ли в нем «#RLB:», а затем сохранить только все, что имеет место после этого?

Конечная цель состоит в том, чтобы получить базу данных для создания цепей марков, что, очевидно, не будет работать со всем этим раздуванием. (Я на самом деле не знаю, поможет ли это, зная, что)

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

uh, well, this seems to work 
in any case, let's try this 

ответ

2

Вот решение Perl:

perl -i -ne 'print if s/^.*?#RLB ://' log.txt 

(я предполагаю, что в юниксовую оболочку Windows, в одинарных кавычках, не буду работать, и вы должны будете использовать двойные кавычки вместо:. -ne "...")

-i означает, что он изменяет файл на месте.
-n запускает предоставленный код для каждой строки.
-e ... указывает код прямо в командной строке.

В коде используется инструкция поиска/замены на основе регулярного выражения. Мы ищем

^  # beginning of line 
.*?  # anything (any character, 0 or more times, as few as possible) 
#RLB : # the text "#RLB :" 

и заменить его ничем, удалив его. Это оставляет только текст после него.

Мы выводим только строки, которые были успешно изменены. Это эффективно отфильтровывает все остальные строки, оставляя сообщения.

Смежные вопросы