文本处理(grep,vim),正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本处理(grep,vim),正则表达式相关的知识,希望对你有一定的参考价值。

文件查看:

  • cat [OPTION]... [FILE]...
    -E:显示行结束符$
    -n:对显示出的每一行进行编号
    -A:显示所有控制符
    -b:非空行编号
    -s:压缩连续的空行成一行

  • tac :内容倒过来显示

  • rev :每行倒过来显示

  • more:分页查看文件
    more [OPTIONS...] FILE...
    -d: 显示翻页及退出提示
    例:ls -R /etc/ | more ,它翻到最后就退出了

  • less:一页一页地查看文件或STDIN输出
    查看时有用的命令包括:
    /文本 :搜索 文本
    n/N :跳到下一个 或 上一个匹配
    less命令是man命令使用的分页器
    例:ls -R /etc/ | more ,它可以上下翻页,用q退出

  • head [OPTION]... [FILE]...
    -c # 指定获取前#字节
    -n # 指定获取前#行
    -# 指定行数
    例:cat -n /etc/passwd | head -n 5

  • tail [OPTION]... [FILE]...
    -c # 指定获取后#字节
    -n # 指定获取后#行
    -# 同上
    -f 跟踪显示文件fd新追加的内容,常用日志监控
    相当于 --follow=descriptor
  • 注意:如果文件被删除掉,如果再创建同名的文件(fd基本上不会相同),修改新的文件内容对它是没有影响的,因为它跟踪的是fd
    -F 跟踪文件名,相当于--follow=name --retry
  • 注意:如果文件被删除掉,如果再创建同名的文件,修改新的文件内容它也会继续显示,因为虽然不是同一个文件但文件名字一样

  • tailf 类似tail –f,当文件不增长时并不访问文件

  • 想要取中间的行可以先head再tail

按列抽取文本

  • cut [OPTION]... [FILE]...
    -d DELIMITER: 指明分隔符,默认tab
    -f FILEDS:
    #: 第#个字段
    #,#[,#]:离散的多个字段,例如1,3,6
    #-#:连续的多个字段, 例如1-6
    混合使用:1-3,7
    -c 按字符切割
    --output-delimiter=STRING指定输出分隔符

例子:

14:34[[email protected] /data]# df |tr -s " " |cut -d" " -f5|tr -d "%"
4:35[[email protected] /data]# df|tr -s " " "%"|cut -d% -f5
上面两个结果都是:
Use
4
0
0
2
0
1
18
1
100

14:35[[email protected] /data]# ifconfig|head -2|tail -1|tr -s " "|cut -d" " -f3
192.168.36.102

paste 合并两个文件同行号的列到一行

  • paste [OPTION]... [FILE]...
    -d 分隔符:指定分隔符,默认用TAB
    -s : 所有行合成一行显示: 每个文件所有列变成一行,然后再将每个文件的内容一行一行的显示出来(按照前后顺序)
    示例:
    paste f1 f2
    paste -s f1 f2

收集文本统计数据wc

计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN中的数据运行
wc story.txt
39 237 1901 story.txt
行数 字(单词)数 字节数(大小)
常用选项
-l 只计数行数:查看多少用户wc -l /etc/passwd ,查看多少用户登陆who|wc -l
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度

文本排序sort

把整理过的文本显示在STDOUT,不改变原始文件
注:sort本身也是标准输入,不加选项会让你键盘输入字符,然后ctrl+d就开始排序.
sort [options] file(s)
常用选项
-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-k X 选项按照使用c字符分隔的X列来整理,能够使用多次
例子:
sort -n -t: -k3 /etc/passwd
df | tr -s " " "%"|cut -d% -f5|sort -nr |head -1
seq 94 |sort -R |head -1 或者echo {1..94} |tr " " " "|sort -R |head -1

uniq

注:uniq也是一个带标准输入的命令
uniq命令:从输入中删除前后相接的重复的行
uniq [OPTION]... [FILE]...
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
注:连续且完全相同方为重复
常和sort 命令一起配合使用:
sort userlist.txt | uniq -c

15:05[[email protected] /data]# sort access_log |cut -d"-" -f1| uniq -c| sort -nr |head
   4870 172.20.116.228 
   3429 172.20.116.208 
   2834 172.20.0.222 
   2613 172.20.112.14 
   2267 172.20.0.227 
   2262 172.20.116.179 
   2259 172.20.65.65 
   1565 172.20.0.76 
   1482 172.20.0.200 
   1110 172.20.28.145 

问:给你两个文本文件f1,f2,分析两个文本文件中相同的行和不同的行.
答:sort f1 |uniq >f1b
sort f2 |uniq >f2b
cat f1b f2b |sort |uniq -u :不同的行
cat f1b f2b |sort |uniq -d :相同的行

比较两个文件区别

  • diff 命令的输出被保存在一种叫做“补丁”的文件中
    使用 -u 选项来输出“统一的(unified)” diff格式文件,最适用于补丁文件
  • patch 复制在其它文件中进行的改变(要谨慎使用)
    适用 -b 选项来自动备份改变了的文件
    diff -u foo.conf foo2.conf > foo.patch :对于foo做哪些改变能成为foo2保存到foo.patch中
    patch -b foo.conf foo.patch

  • ss nt :显示当前远程连接的主机IP
    ss nt |tr -s " " ":" |cut -d: -f6 |sort|uniq -c |sort -rn

文本处理

grep:文本过滤(模式:pattern)工具

grep, egrep, fgrep(不支持正则表达式搜索)
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件

  • grep [OPTIONS] PATTERN [FILE...]
    grep root /etc/passwd
    grep "$USER" /etc/passwd:双引号可以识别变量
    grep ‘$USER‘ /etc/passwd :单引号会把里面内容全部当做字符
    grep `whoami` /etc/passwd :反向单引号则可以识别命令和变量
  • grep处理命令的时候是按照一行一行处理,每次处理一行存入它自己的内存空间中,处理完之后存入下一行继续处理直到结束.
  • 命令选项:

    --color=auto: 对匹配到的文本着色显示
    -m # 匹配#次(行)后停止:因为每次读入一行
    -v 显示不被pattern匹配到的行
    -i 忽略字符大小写
    -n 显示匹配的行号
    -c 统计匹配到的行数:显示匹配到pattern的行的总数
    -o 仅显示匹配到的字符串:因为并不是固定的,所以还是很有意义的
    -q 静默模式,不输出任何信息 :echo $? 找到显示为0 找不到显示为1,返回值不同
    -A # after, 显示找到的行外加后#行
    -B # before, 显示找到的行外加前#行
    -C # context, 显示找到的行外加前后各#行
    -e 实现多个选项间的逻辑or关系
    grep –e ‘cat ’ -e ‘dog’ file
    并且and的话可以多次过滤即可
    -w 匹配整个单词:pattern前后不能带字母,数字或者下划线(它认为数字和下划线也是单词)
    -E 使用ERE:扩展的正则表达式
    -F 相当于fgrep,不支持正则表达式
    -f file 根据模式文件处理:根据文件里面写的pattern来过滤,每一行都是一个pattern,每一行的parteen是或的关系

正则表达式

REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
程序支持:grep,sed,awk,vim, less,nginx,varnish等
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE grep -E, egrep
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组
man 7 regex

  • 注意:通配符是处理文件名的时候使用的,正则表达式匹配文件内容的,但也可以用ls|grep ....的方式处理
  • 通配符和正则表达式容易混淆的符号等:
    *:通配符中为任意长度任意字符;正则表达式中为匹配前面的字符的0次或任意多次,具有贪婪模式
    .:通配符中没有意义 ,正则表达式中代表任意的一个字符
    ?:通配符中代表一个任意字符,正则表达式中代表匹配前面字符0次或者1次
    []:中括号内的内容都是代表匹配其中任以一个字符,但是注意通配符中的a-zA-Z等等,是按照小写大写小写大写的顺序,而通配符中的a-z和A-Z分别就是代表小写字母和大写字母
    ^ 和[^] 在正则表达式中分别代表行首铆定和指定范围外,别混淆了
    系统定义的字符匹配同样只是代表一个,因此要在外面再加上中括号比如[[:upper:]]

字符匹配:

. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母 [:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 [:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

  • 匹配前面的字符任意次,包括0次
    贪婪模式:尽可能长的匹配
    .* 任意长度的任意字符
    ? 匹配其前面的字符0或1次
    + 匹配其前面的字符至少1次
    {n} 匹配前面的字符n次
    {m,n} 匹配前面的字符至少m次,至多n次
    {,n} 匹配前面的字符至多n次
    {n,} 匹配前面的字符至少n次

  • 注意:: grep " ?"
    其实它能匹配了所有的行(?前面只要写任意的一个字符,包括空格什么的都行),只不过如果没有任何匹配到的结果的话,它不会显示红色匹配到的字符而已,但所有的行都会算到匹配结果中并输出

位置锚定:定位出现的位置

^ 行首锚定,用于partten的最左侧
$ 行尾锚定,用于partern的最右侧
^PATTERN$ ,用于partern匹配整行
^$ 空行
^[[:space:]]*$ 空白行
< 或  词首锚定,用于单词模式的左侧
> 或  词尾锚定,用于单词模式的右侧
<PATTERN> 匹配整个单词

例子:

  • 非#开头的行
    grep -v "^#" file :这个结果中包含空行
    grep "^[^#]" file :结果中不包含空行,因为空行是0个字符,匹配要的结果是以除了#以外的其他任意一个字符开头的行,所以空行不在内
  • grep "^$" file:空行显示出来
  • grep -v "^$" file:去掉文件中空行
  • grep "<word>" file 和grep -w "word" file :查找就是这个word的字符,不能多也不能少
  • grep -Ev "^#|^$" file :去掉文件中非#开头的非空行
  • grep -Ev "(^#|$)" file:同上
去除centos版本号:
09:32[[email protected] ~]# cat /etc/system-release | grep -Eo "([0-9]+.){2}[0-9]+"
7.6.1810
09:35[[email protected] ~]# cat /etc/centos-release |grep -oE "[0-9]+"
7
6
1810
20:31[[email protected] ~]# cat /etc/centos-release |grep -oE [0-9]+| head -1
7
20:31[[email protected] ~]# cat /etc/centos-release |grep -oE " [0-9]+" |tr -d " " 
7
20:32[[email protected] ~]# cat /etc/centos-release |grep -oE "[0-9]+" |grep -m 1 ".*" 
7

20:24[[email protected] ~]# echo abcd |grep -Eo "."
a
b
c
d
  • 注意当用grep的-o选项的时候,匹配的字符如果在一行中有多个匹配,但是这多个匹配之前有分隔(或者说没有分隔但每一个字符都是一个匹配),用-o选项结果中会每行显示一个结果分行显示,如上面的例子。

分组

分组:() 将一个或多个字符捆绑在一起,当作一个整体处理,如:(root)+
分组括号中的partern匹配到的内容会被正则表达式引擎记录于内部的变量中,这些
变量的命名方式为: 1, 2, 3, ...
1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例: (string1+(string2))
1 :string1+(string2)

2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
举例:

20:15[[email protected] /data]# echo root radt root rawd |grep "(r..t).*1"
root radt root rawd

20:23[[email protected] /data]# echo roXt radt root radtwd |grep "(r..t).*1"
roXt radt root radtwd

或者or:|
示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat
grep "abc{3}" :这是c出现了3次相当于 abccc
grep "(abc){3}" :abc出现了三次 相当于abcabcabc (分组的第一种应用)
grep "^(r|b)" :以r或者b开头的,注意要把它括起来作为一个整体
同理: grep "abc|d":表示abc或者d
grep "ab(c|d)":表示abc或者abd

  • 注意: 括号的地方不是括的(ab)c|d ,而是包含着这个或字符的部分,注意别括错了。
    20:00[[email protected] /data]# df| grep "/dev/sd"|grep "[0-9]{1,3}%" -o |grep "[0-9]" -o
    4
    1
    1
    8
    20:15[[email protected] /data]# df| grep "/dev/sd"|grep "[0-9]{1,3}%" -o |grep "[0-9]+" -o
    4
    1
    18

扩展的正则表达式

egrep

egrep = grep -E
egrep [OPTIONS] PATTERN [FILE...]
扩展正则表达式的元字符:

字符匹配:

. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符

次数匹配:

  • 匹配前面字符任意次
    ? 0或1次
  • 1次或多次
    {m} 匹配m次
    {m,n} 至少m,至多n次

    位置锚定:

    ^ 行首
    $ 行尾
    <,  语首
    >,  语尾

    分组:

    ()
    后向引用:1, 2, ...

    或者:

    a|b a或b
    C|cat C或cat
    (C|c)at Cat或cat

例子:取IP
ifconfig |grep -E "([0-9]{1,3}.){3}[0-9]{1,3}"
ifconfig eth0 |grep -Eo "([0-9]{1,3}.){3}[0-9]{1,3}" |head 1

20:23[[email protected] /data]# ifconfig |grep -E "([0-9]{1,3}.){3}[0-9]{1,3}"
inet 192.168.36.102  netmask 255.255.255.0  broadcast 192.168.36.255 inet 127.0.0.1  netmask 255.0.0.0
inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

20:34[[email protected] /data]# ifconfig ens33 |grep -Eo "([0-9]{1,3}.){3}[0-9]{1,3}"
192.168.36.102
255.255.255.0
192.168.36.255

找出passwd用户名和shell相同的:
egrep "^(.*):.*<1$" /etc/passwd

VIM文本编辑工具

vi 老版本的文本编辑器
gedit 一个简单的图形编辑器
gvim 一个Vim编辑器的图形版本

vim [OPTION]... FILE...

+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行的行
–b file 二进制方式打开文件
–d file1 file2… 比较多个文件
-m file 只读打开文件
vim -e file 或 ex file 直接进入ex模式
如果该文件存在,文件被打开并显示内容
如果该文件不存在,当编辑后第一次存盘时创建它

  • 注意: +号必须要输入; pattern后面没有/;
  • 注意:命令模式查找都不需要再在partern和面加上/了,但是扩展命令模式的地址定界需要pattern两边都加上/

    三种主要模式:

    命令(Normal)模式:默认模式,移动光标,剪切/粘贴文本
    插入(Insert)或编辑模式:修改文本
    扩展命令(extended command )模式:保存,退出等
    Esc键 退出当前模式
    Esc键 Esc键 总是返回到命令模式

模式转换

命令模式 --> 插入模式

i insert, 在光标所在处输入
I 在当前光标所在行的行首输入
a append, 在光标所在处后面输入
A 在当前光标所在行的行尾输入
o 在当前光标所在行的下方打开一个新行
O 在当前光标所在行的上方打开一个新行

插入模式 --------> 命令模式

ESC

命令模式 --------> 扩展命令模式

:

扩展命令模式 --------> 命令模式

ESC,enter

退出VIM

扩展命令模式:

:q 退出
:q! 强制退出,丢弃做出的修改
:wq 保存退出
:x 保存退出

命令模式

ZZ 保存退出
ZQ 不保存退出

命令模式操作:

命令模式光标跳转

字符间跳转:

h: 左 l: 右 j: 下 k: 上
#COMMAND:跳转由#指定的个数的字符

单词间跳转:

w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
#COMMAND:由#指定一次跳转的单词数

当前页跳转:
  • 移动光标
    H:页首 M:页中间行 L:页底
  • 移动光标所在行
    zt:将光标所在当前行移到屏幕顶端
    zz:将光标所在当前行移到屏幕中间
    zb:将光标所在当前行移到屏幕底端
    行首行尾跳转:

    ^ 跳转至行首的第一个非空白字符
    0 跳转至行首
    $ 跳转至行尾

    行间移动:

    #G 或者扩展命令模式下:# 跳转至由第#行
    G 最后一行
    1G, gg 第一行

    句间移动:

    ) 下一句 ( 上一句

    段落间移动:

    } 下一段 { 上一段

    翻屏

    Ctrl+f 向文件尾部翻一屏
    Ctrl+b 向文件首部翻一屏
    Ctrl+d 向文件尾部翻半屏
    Ctrl+u 向文件首部翻半屏

    字符编辑:

    x 删除光标处的字符
    #x 删除光标处起始的#个字符
    xp 交换光标所在处的字符及其后面字符的位置
    ~ 转换大小写
    J 删除当前行后的换行符

    替换命令(r, replace)

    r 替换光标所在处的字符
    R 切换成REPLACE模式

    删除命令:

    d 删除命令,可结合光标跳转字符,实现范围删除
    d$ 删除到行尾
    d^ 删除到非空行首
    d0 删除到行首
    dw 删除一个后面单词
    de 删除一个后面单词到词尾
    db 删除前面一个单词
    #COMMAND :先输入数字,然后跟上上面的命令,多个单词,多行等删除
    dG 删除到最后 dgg 删除到最前 d#G 删除到第几行 :注意都是按照光标处开始的
    同理 :d#l(#dl) d#h(#dh) dj:删除当前行和下一行 dk:删除当前行和上一行 类似于d+方向键
    同理还有: dH dM dL ,d( d) d{ d} 等,也可以前面加数字做更多修改
    注意没有dzz dzt dzb

    dd:删除光标所在的行

    #dd 多行删除

    D:从当前光标位置一直删除到行尾,等同于d$
  • d命令其实是剪切的命令
    复制命令(y, yank):

    y 复制,行为相似于d命令
    y$
    y0
    y^
    ye
    yw
    yb
    #COMMAND
    yy:复制行
    #yy 复制多行
    Y:复制整行

  • 其他更多用法同理类似于上面的d
    粘贴命令(p, paste):

    小写p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘
    贴至当前光标所在处的后面
    大写P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘
    贴至当前光标所在处的前面

    改变命令(c, change)

    c: 修改后切换成插入模式 :命令模式 --> 插入模式 (就相当于先d然后直接进入命令模式,更多用法和d相同)
    c$
    c^
    c0
    cb
    ce
    cw
    #COMMAND

    cc:删除当前行并输入新内容,相当于S

    #cc :删除多行并切换插入模式编辑

    C:删除当前光标到行尾,并切换成插入模式

一些其他特殊操作:

  • 100iwang [ESC] 粘贴“wang” 100次
  • <start position><command><end position>
    常见Command
    y 复制、 d 删除、 gU 变大写、 gu 变小写
    例如: 0y$ 命令
    0 → 先到行头
    y → 从这里开始拷贝
    $ → 拷贝到本行最后一个字符
  • 注意:上面的拷贝到最后一个字符和yy并不一样,利用p命令就可以知道上面的命令会把拷贝的所有字符看作是一个长字符串,而不是一行
  • di" 光标在”“之间,则删除”“之间的内容:也可以是() [] {} 等,下同
  • yi( 光标在()之间,则复制()之间的内容
  • vi[ 光标在[]之间,则选中[]之间的内容
  • dt? 删除字符直到遇见光标之后的第一个 ? 字符
  • yt? 复制字符直到遇见光标之后的第一个 ? 字符

查找

/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向

撤销更改

u 撤销最近的更改
#u 撤销之前多次更改
U 撤消光标落在这行后所有此行的更改
Ctrl - r 重做最后的“撤消”更改
. 重复前一个操作
#. 重复前一个操作#次

扩展命令模式

基本操作

按“:”进入Ex模式
创建一个命令提示符: 处于底部的屏幕左侧
常见命令
w 写(存)磁盘文件
wq 写入并退出
x 写入并退出
q 退出
q! 不存盘退出,即使更改都将丢失
r filename 读文件内容到当前文件中:可以多次读入,都放在一起
w filename 将当前文件内容写入另一个文件
!command 执行命令 :执行命令的时候会退出VIM在外面执行命令,然后再按一次回车回到VIM
r!command 读入命令的输出

地址定界:start_pos,end_pos
  • 注意地址定界是按照行来匹配,同时操作最小单位也是一行
    # 具体第#行,例如2表示第2行
    #,# 从左侧#表示起始行,到右侧#表示结尾行
    #,+# 从左侧#表示的起始行,加上右侧#表示的行数
    示例:2,+3 表示2到5行
    . 当前行
    $ 最后一行
    .,$-1 当前行到倒数第二行
    % 全文, 相当于1,$
  • 也可以用匹配模式:
    /pattern/ 第一次匹配到pattern的行
  • 注意它从当前行的下一行开始匹配,不匹配当前行,如果当前行的下面没有找到直到底部,则会回到开头再次寻找直到第一次匹配到字符的行
    /pat1/,/pat2/ 从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
    #,/pat/ :从第#行到匹配到pat的行
    /pat/,$ :从匹配到pat的行到最后一行

    地址定界使用方式:后跟一个编辑命令

    d y
    w file: 将范围内的行另存至指定文件中
    r file:在指定位置插入指定文件中的所有内容

  • 注意:命令模式查找都不需要再在partern和面加上/了,但是扩展命令模式的地址定界需要pattern两边都加上/
  • 例子:
    10,20d: 删除10到20行
    /^#/d :删除第一次匹配到的以#开头的行
    g/^#/d :删除全部匹配到的以#开头的行,特殊命令g
    %s/root/administor
在扩展命令模式下完成查找替换操作

格式:s/要查找的内容/替换为的内容/修饰符(/可以换位@或者#等等)
要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用1, 2, ...等后向引用符号;还可以使用“&” 引用前面查找时查找到的整个内容
修饰符:
i 忽略大小写
g 全局替换(如果不输入g,则在默认情况下,每一行只替换第一次出现的匹配的字符)
gc 全局替换,每次替换前询问

VIM寄存器

  • 有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间
    共享
  • 寄存器名称a,b,…,z,格式:"寄存器 放在数字和命令之间
    如:3"tyy 表示复制3行到t寄存器中
    "tp 表示将t寄存器内容粘贴
  • 未指定,将使用无命名寄存器
  • 注意: "a3yy 和3"ayy 都是复制3行, 数字放在前后没有影响,还有更多用法参考y(d)中的那些,都可以使用。
  • 有10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。
    当新的文本变更和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享

    标记和宏(macro)

  • ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
  • ‘a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
  • qa 录制宏 a,a为宏的名称 (qb,qc.....)
  • q 停止录制宏
  • @a 执行宏 a
  • @@ 重新执行上次执行的宏

用二进制方式打开文件

vim –b binaryfile
扩展命令模式下,利用xxd命令转换为可读的十六进制:%!xxd
插入模式下,编辑二进制文件
扩展命令模式下,利用xxd命令转换回二进制:%!xxd -r
保存退出

可视化模式

允许选择的文本块

v 面向字符
V 面向行
ctrl-v 面向块

可视化键可用于与移动键结合使用

w ) } >等

  • >代表缩进 ,在命令模式下连续按两次>也可以缩进

    突出显示的文字可被删除,复制,变更,过滤,搜索,替换等

VIM使用多个“窗口”

多文件分割

vim -o|-O FILE1 FILE2 ...
-o: 水平分割
-O: 垂直分割

  • 在窗口间切换:Ctrl+w, Arrow

    单文件窗口分割

    Ctrl+w,s:split, 水平分割
    Ctrl+w,v:vertical, 垂直分割
    ctrl+w,q:取消当前窗口
    ctrl+w,o:取消全部只留下当前窗口
    :wqall 退出 qall! 强制退出不保留

定制vim的工作特性

  • 配置文件:永久有效
    全局:/etc/vimrc
    个人:~/.vimrc (个人的都是隐藏的,全局的不隐藏)
  • 扩展命令模式:当前vim进程有效
    1. 行号
      显示:set number,简写 set nu
      取消显示:set nonumber, 简写 set nonu
    2. 忽略字符的大小写
      启用:set ignorecase,简写 set ic
      不忽略:set noic
    3. 自动缩进
      启用:set autoindent,简写 set ai
      禁用:set noai
    4. 复制保留格式
      启用:set paste
      禁用:set nopaste
  • 这个是为了复制代码的时候不让它再进行
    1. 显示Tab和换行符 ^I 和$显示
      启用:set list
      禁用:set nolist
    2. 高亮搜索
      启用:set hlsearch
      禁用:set nohlsearch
    3. 语法高亮
      启用:syntax on
      禁用:syntax off
  • 比如/etc/passwd中的各种颜色
    1. 文件格式
      启用windows格式:set fileformat=dos
      启用unix格式:set fileformat=unix
      简写 set ff=dos|unix
  • 默认格式就是linux,修改格式便可以打开文件后使用这个命令,然后保存退出(默认的linux格式打开其他文件不会影响,因为只对这些命令都只对当前的vim进程有效
    1. 设置文本宽度
      set textwidth=65 (vim only):达到多少宽度自动换行,从左到右
      set wrapmargin=15 :从右到左
    2. 设置光标所在行的标识线
      启用:set cursorline,简写 set cul
      禁用:set nocursorline

Set 帮助

  • 扩展模式下:
    :help option-list
    :set or
    :set all
    vi/vim内置帮助
    :help
    :help topic
    Use :q to exit help
  • vimtutor:可以随便使用它进行练习,哪怕在里面删除保存退出也不会对它造成影响

以上是关于文本处理(grep,vim),正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

vim 和grep 正则表达式相似和区别

grep系的介绍及正则表达式详解

Shell编程之正则表达式

文本三剑客之grep加vim编辑器

正则表达式和grep用法,及文本查看处理工具

Linux文本处理三剑客之grep一族与正则表达式