我有一个日志文件。其一般格式为
log text 1 <br/>
log text 2 <br/>
Error: xxxxxx <br/>
error description (1 line only) <br/>
log text 3 <br/>
log text 4 <br/>
.... <br/>
Error: xxxxxx <br/>
error description (1 line only) <br/>
log text 5 <br/>
.... <br/>
我想选择并提取包含两行错误的两行(每行错误有两行。第一行总是有错误:作为关键字。日志文件中的其他任何地方都不会出现Word错误。)
如何使用正则表达式或任何其他方式执行此操作。我可以使用MacOS,Unix或Windows XP。 MacOS首选。
答案 0 :(得分:0)
在mac或基于unix的操作系统上使用grep
grep -i error -A2 inputfile
答案 1 :(得分:0)
例如,找到这两行的正则表达式是:
^.*?Error.*(?:\r?\n|\r).*$
^
...在一行的开头开始每次搜索。
.*?
...匹配任何字符,除了回车和换行零次或多次非贪婪。非贪婪意味着尽可能少的字符。换句话说,在第一次出现Error
时停止,而不是在最后一次出现时停止。
Error
...必须在2行中的第一行找到这个词才能匹配。
.*
...匹配任何字符,除了回车和换行零次或多次贪婪。贪婪意味着现在匹配尽可能多的角色。
(?:\r?\n|\r)
...是一个非标记组,匹配回车+换行(DOS / Windows文本文件),或仅匹配换行(UNIX文本文件),或仅回车(旧) MAC文本文件)。
.*
...匹配任何字符,除了回车和换行0次或多次贪婪。
$
...锚定为行尾。匹配字符串中不包含行终止。
换句话说,这个表达式匹配包含单词Error
的任何位置的整行,第一行的行终止符和下一行的所有内容一直到行尾,但是也不匹配第二行的行终止符线。
UltraEdit 是一个可用于Windows,Linux和Mac的共享软件文本编辑器。
在搜索 - UltraEdit 的搜索 - 查找对话框中使用 Perl 正则表达式,使用高级查找选项列出包含字符串的行启用结果将所有找到的2个线串写入列出所有找到的行的窗口。
打开此窗口的上下文菜单(右键单击Windows)并单击复制到剪贴板会导致将所有找到的行复制到系统剪贴板。
按Ctrl + N打开新文件,按Ctrl + V粘贴复制的行,按Ctrl + S保存新文件,最后得到一个包含所需信息的文件。
另一种方法是使用 UltraEdit 脚本FindStringsToNewFile和缩减的正则表达式搜索字符串Error.*(?:\r?\n|\r).*
。此脚本将所有找到的字符串从关键字Error
开始,并在下一行的结尾处直接写入新文件。
还有一点需要注意:
如果.
(点)也匹配换行符,例如回车符和换行符取决于标志。在 UltraEdit 中,默认设置标志为点与换行符不匹配。在(?s)
处于Perl正则表达式搜索字符串的开头时,标志会更改,然后该点也会匹配此搜索的换行符。如果在搜索字符串的开头有(?-s)
,则可以设置标志,如果应用程序的内部默认值相反,则不能使用点匹配换行符。