runsisi's

technical notes

vim 处理日志文件

2019-01-23 runsisi#linux

在分析大的日志文件之前可能需要通过 vim(大的文件,可能其他文本处理工具打不开)进行一些预处理。

应用场景

删除所有匹配的行:

:g/pattern/d

删除多个 pattern(即正则表达式的或关系):

:g/pattern1\|pattern2\|pattern3/d

删除所有不匹配的行:

:g!/pattern/d

删除所有空行:

:g/^$/d

搜索 pattern 并删除前后多行,可以使用 +/-[line][command] 或者 +/-[line1],+/-[line2][command],如:

# 删除匹配的前一行
:g/pattern/-1d
# 删除匹配的后一行
:g/pattern/+1d
# 删除匹配的当前行以及前一行(其中 . 表示当前行)
:g/pattern/-1,.d
# 删除匹配的当前行以及后一行
:g/pattern/.,+1d
# 删除匹配的当前行以及前一行和后一行
:g/pattern/-1,+1d

删除指定范围(包括)内的行:

# 删除所有行
:1,$d
# 删除从第 1 行到第 200 行
:1,200d
# 删除第 100 行到当前行
:100,.d
# 删除第 100 行到当前行上一行
:100,-1d
# 删除第 100 行到当前行下一行
:100,+1d
# 删除当前行及前 5 行以及后 10 行
:-5,+10d

删除多行,如删除下面的多行数据:

CREATE SEQUENCE account_mygraph_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

匹配的关键是下面的 \_.,此外 \{-} 是非贪婪匹配:

:%s/^CREATE SEQUENCE\_.\{-};//

注意 % 实际上是 1,$ 的简写

全局替换(不区分是否是一个完整单词,只要匹配就进行替换):

:%s/abc/xyz

精确匹配整个单词(类似于标准正则表达式中的 \babc\b)全局替换:

:%s/\<abc\>/xyz

大小写不敏感精确匹配整个词全局替换:

:%s/\<abc\>\c/xyz

当某一行的数据量特别多,整个屏幕都放不下时,可能会期望把这一行数据单独拷贝到另一个文件,此时可以先用 vi 进行复制,然后,:e /path/to/newfile 在当前 vi 会话中打开一个新的文件,然后 p 粘贴即可。

统计文件中符合某个搜索条件的行数:

:%s/abc//n

统计当前文件总行数(包括当前所在行号):

ctrl + g

参考资料

vim regular expression

http://vimregex.com/

Regular Expression matching more than a single line in Vim

http://blog.vinceliu.com/2007/12/regular-expression-matching-more-than.html

Count number of matches of a pattern

http://vim.wikia.com/wiki/Count_number_of_matches_of_a_pattern

Deleting a range of n lines before and after a matched line?

https://vi.stackexchange.com/questions/3411/deleting-a-range-of-n-lines-before-and-after-a-matched-line