linux小白成长之路5 - grep vim 正则表达式

1、grep命令

选项说明:
--color=auto:对匹配到的文本着色显示;
-v:显示不被模式匹配到的行;
-i:忽略字符大小写;
-n:显示匹配的行号;
-c:统计匹配到的字符串;
-o:仅显示匹配到的字符串;
-q:静默模式,不输出任何信息;
-A #:表示显示匹配到的行并显示该行后#行,#表示为数字;
-B #:表示显示匹配到的行并显示该行前#行,#表示为数字;
-C #:表示显示匹配到的行并显示该行前后各#行,#表示为数字;
-e:实现多个选项的逻辑or或更新;
-w:匹配整个单词;
-E:使用ERE扩展正则,等效于egrep命令;
-F:相当于fgrep,不使用正则表达式;
【例1】查找/etc⽬录下,所有包含conf字串的⽂件
[root@magedu ~]# ls -R /etc|grep conf
anthy-conf
asound.conf
autofs.conf
autofs_ldap_auth.conf
【例2】显⽰/root/passwd⽂件中包含root字串所在的⾏并显⽰⾏号
[root@magedu ~]# grep root /root/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
【例3】显⽰passwd⽂件中,不包含bash字串的⾏,并显⽰⾏号
[root@magedu ~]# grep -n -v bash passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
...
【例4】显⽰passwd⽂件中,包含root字串的⾏的总⾏数
[root@magedu ~]# grep -c root passwd
2
【例5】仅显⽰/root/passwd⽂件中的root字串及所在的⾏号
[root@magedu ~]# grep -on root passwd
1:root
1:root
1:root
11:root
【例6】显⽰/root/passwd⽂件中,包含root字串的⾏和其下2⾏的内容
[root@magedu ~]# grep -A 2 root passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologi
【例7】显⽰/root/passwd⽂件中,包含root字串的⾏和其上2⾏的内容
[root@magedu ~]# grep -B 2 root passwd
root:x:0:0:root:/root:/bin/bash

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
【例8】显⽰/root/passwd⽂件中,包含root字串的⾏和其上下各2⾏的内容
[root@magedu ~]# grep -C 2 root passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
【例9】扫描172.18.120.0/24⽹段,显⽰在线的ip地址
[root@magedu ~]# nmap -sP 172.18.120.0/24 | grep -B1 'Host is up'| grep for | cut -d" " -f5
172.18.120.7
172.18.120.17
172.18.120.26
172.18.120.27
172.18.120.69
172.18.120.123
172.18.120.135
172.18.120.237
172.18.120.254
【例10】显⽰/root/passwd⽂件中,包含root字串或包含nologin字串的⾏
[root@magedu ~]# grep -e root -e nologin passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
或写成:
[root@magedu ~]# grep "root|bin" passwd
【例11】匹配root整个单词
[root@magedu ~]# echo -e "root\nrooter" |grep -w root
root
或写成:
[root@magedu ~]# echo -e "root\nrooter" |grep "\<root\>"
[root@magedu ~]# echo -e "root\nrooter" |grep "\broot\b"
2、正则表达式
分两类:基本正则表达式(BRE)和扩展正则表达式(ERE)。
元字符分类:字符匹配、匹配次数、位置锚定、分组。
程序支持:grep、sed、awk、vim、less、nginx、varnish等。
下面先介绍下基本正则表达式各元字符:
字符匹配:
.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符,例如[A-Z0-9]:表示匹配一个大写字符或数字;
[^]:匹配指定范围外的任意单个字符;
[:alnum:]:字母和数字;
[:alpha:]:代表任何英文大小写字符,亦即 A-Z, a-z;
[:lower:]:小写字母 [:upper:] 大写字母;
[:blank:]:空白字符(空格和制表符);
[:space:]:水平和垂直的空白字符(比[:blank:]包含的范围广);
[:cntrl:]:不可打印的控制字符(退格、删除、警铃...);
[:digit:]:十进制数字 [:xdigit:]十六进制数字;
[:graph:]:可打印的非空白字符;
[:print:]:可打印字符;
[:punct:]:标点符号。
注意:⽂件名通配符当中,表⽰0或多个任意字符,?表⽰任意⼀个单个字符。
匹配次数:⽤在要指定次数的字符后⾯,⽤于指定前⾯的字符要出现的次数
: 匹配前面的字符任意次,包括0次(贪婪模式:尽可能长的匹配);
. 任意长度的任意字符;
\? 匹配其前面的字符0或1次;
+ 匹配其前面的字符至少1次;
{n} 匹配前面的字符n次;
{m,n} 匹配前面的字符至少m次,至多n次;
{,n} 匹配前面的字符至多n次;
{n,} 匹配前面的字符至少n次。
位置锚定:定位出现的位置
^:行首锚定,用于模式的最左侧;
$:行尾锚定,用于模式的最右侧;
^PATTERN$:用于模式匹配整行;
^$:空行;
^[[:space:]]
$:空白行;
\< 或 \b:词首锚定,用于单词模式的左侧;
\> 或 \b:词尾锚定;用于单词模式的右侧;
\<PATTERN\>:匹配整个单词。
分组:
():将一个或多个字符捆绑在一起,当作一个整体进行处理,如: (root)+;
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3,
...
\1:表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
例如:
(string1+(string2))
\1:表示string1+(string2)

\2:表示string2
后向引用:引用前面的分组括号中的模式所匹配字符, 而非模式本身;
或者: |,例如:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat。
再来介绍下egrep命令和扩展正则表达式:
egrep命令仅支持扩展正则表达式的文本过滤命令,等价于grep -E。
扩展正则表达式元字符:
字符匹配:
.:任意单个字符;
[]:指定范围的字符;
[^]:不在指定范围的字符。
次数匹配:区别基本正则表达式的是使⽤简洁,不需要使⽤转义符号(\)
:匹配前面字符出现任意次;
?:匹配前面出现字符0次或1次;
+:匹配前面出现字符1次或多次;
{m}:匹配前面出现字符n次;
{m,n}:匹配前面出现字符最少m次,最多n次。
位置锚定:
^:匹配行首;
$:匹配行尾;
\<,\b:匹配词首;
\>,\b:匹配词尾。
分组:
():生成分组模式;
后向应用:\1,\2,...
或者:
a|b:表示匹配a或b;
C|cat:表示匹配C或cat;
(C|c)at:表示匹配Cat或cat。
【例12】过滤出现0次或多次的字⺟a
[root@magedu ~]# echo abaacaaad | grep -o "a
"
a
aa
aaa
【例13】过滤出现0次或1次的字⺟a
[root@magedu ~]# echo abaacd|grep -o "a\?"
a
a
a
【例14】过滤出现1次或多次的字⺟a
[root@magedu ~]# echo zzzopabaacd|grep -o "a+"
a
aa
【例15】过滤出现2次字⺟a
[root@magedu ~]# echo abaacaaada|grep -o "a{2}"
aa
aa
【例16】过滤出现⾄少2次,最多4次的字⺟a
[root@magedu ~]# echo abaacaaada|grep -o "a{2,4}"
aa
aaa
【例17】过滤出现⾄少3次的字⺟a
[root@magedu ~]# echo abaacaaada|grep -o "a{3,}"
aaa
【例18】过滤出现最多2次的字⺟a
[root@magedu ~]# echo abaacaaada|grep -o "a{,2}"
a
aa
aa
a
a
【例19】过滤/root/passwd⽂件中,以root开头的⾏
[root@magedu ~]# grep "^root" passwd
root:x:0:0:root:/root:/bin/bash
【20】过滤/root/passwd⽂件中,以root结尾的⾏
[root@magedu ~]# echo "root:x:0:0:root:/root:/bin/root" >> passwd
[root@magedu ~]# grep "root$" passwd
root:x:0:0:root:/root:/bin/root
【21】过滤nginx.conf⽂件中,不显⽰空⾏和以空格开头0次或多次后跟#号的⾏,其余⾏都显⽰
[root@magedu ~]# grep -v "^$|^[[:space:]]#" /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
...
【例22】过滤ip命令输出的所有ip地址
[root@magedu ~]# ip a|grep -E -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"
127.0.0.1
172.18.121.79
172.18.255.255
1.1.1.1
1.1.1.255
...
注意:此种正则表达式没有完全考虑ip地址是否为可⽤的ip地址的情况,如要精确匹配合法可⽤ip地址,还需进⼀步编写正
则表达式匹配模式。
【例23】显⽰/proc/meminfo⽂件中以⼤⼩s开头的⾏
[root@magedu ~]# grep "^s|^S" /proc/meminfo
SwapCached: 68972 kB
SwapTotal: 2097148 kB
SwapFree: 1688572 kB
Shmem: 2100 kB
Slab: 78072 kB
SReclaimable: 29616 kB
SUnreclaim: 48456 kB
此例可有多种解法:
[root@magedu ~]# grep "^(s|S)" /proc/meminfo
[root@magedu ~]# grep -i "^s" /proc/meminfo
[root@magedu ~]# grep "^[sS]" /proc/meminfo
[root@magedu ~]# grep -e ^s -e ^S /proc/meminfo
【例24】找出/etc/passwd⽤户名同shell名的⾏
[root@magedu ~]# grep "^(\<[[:alpha:]]+\>).
/\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
【例25】找出/etc/rc.d/init.d/functions⽂件中⾏⾸为某单词(包括下划线)后⾯跟⼀个⼩括号的⾏
[root@magedu ~]# grep -o "^\<([[:alpha:]_])+\>()" /etc/rc.d/init.d/functions
checkpid()
_kill_pids_term_kill_checkpids()

【例26】将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前⾯
[root@magedu ~]# echo welcome to magedu linux|grep -o "."|sort|uniq -c|sort -nr
3 e
3
2 u
2 o
2 m
2 l
1 x
1 w
1 t
1 n
1 i
1 g
1 d
1 c
1 a
【例27】利⽤扩展正则表达式分别表⽰0-9、10-99、100-199、200-249、250-255
[root@magedu ~]# echo {0..9}|egrep -o "[0-9]"
0
...
9
[root@magedu ~]# echo {10..99}|egrep -o "[1-9]{1}[0-9]{1}"
10
...
99
[root@magedu ~]# echo {100..199}|egrep -o "1[0-9]{2}"
100
...
199
[root@magedu ~]# echo {200..249}|egrep -o "2[0-4]{1}[0-9]{1}"
200
...
249
[root@magedu ~]# echo {250..255}|egrep -o "25[0-5]{1}"
250
251
252
253
254
255
实验⼆:vi/vim编辑器
实验⽬的
熟练使用vim编辑器编辑文本文件。vim编辑器是vi编辑器的升级增强版本,使用操作上没区别。vim编辑器就如同
在windows系统上的office软件word程序一样,可以编辑、创建、添加、删除、撤销、取消撤销等文本文件的操
作,还更多高级使用方法。
前提准备
可用的centos7系统。
实验步骤 vim编辑器主要有3种模式:
命令模式(默认的模式)、插入模式、扩展命令模式
其它模式还有视图模式、替换模式等。
主要3种模式之间转换⽅法: 命令模式转换为插⼊模式:键⼊i、a、o键,⼤⼩写均可。
插入模式转换为命令模式:按Esc键。
命令模式转换为扩展命令模式:输入入冒号,即键入Shif+:
扩展命令模式转换为命令模式:按Esc键。
其它模式:选择模式
1、命令模式 命令模式实现的功能有:移动光标、复制、剪切、撤销、重做,进⼊其他模式。
退出:
ZQ:强制退出不保存
ZZ:保存并退出
字符间跳转:
h:左
l:右
j:下
k:上
单词跳转:
w:下⼀个单词的词⾸
e:当前或下⼀个单词的词尾
b:当前或前⼀个单词的词⾸
#COMMAND:由#指定⼀次跳转的单词数,COMMAND可替换为w/e/b等命令
当前页跳转:
H:⾸页
M:中间⾏
L:页底
⾏⾸⾏尾跳转:
^:跳转⾄⾏⾸的第⼀个⾮空⽩字符
0:跳转⾄⾏⾸
$:跳转⾄⾏尾
⾏间移动:
#G、扩展模式:#:跳转⾄由#指定
G:跳转⾄最后⼀⾏
1G,gg:跳转⾄第⼀⾏
段落间移动:
}:跳转⾄下⼀段
{:跳转⾄上⼀段
句间移动:
):跳转⾄下⼀句
(:跳转⾄上⼀句
翻屏操作:
Ctrl+f:向⽂件尾部翻⼀屏
Ctrl+b:向⽂件⾸部翻⼀屏
Ctrl+d:向⽂件尾部翻半屏
Ctrl+u:向⽂件⾸部翻半屏
字符编辑:
x:删除光标处的字符
#x:删除光标处起始的#个字符
xp:交换光标所在处的字符及其后⾯的字符的位置
~:转换⼤⼩写
J:删除当前⾏后的换⾏符
替换命令:
r:替换光标所在处的字符
R:切换成替换模式
删除命令:
d:删除(也称剪切)命令,结合光标跳转字符,实现范围删除
d$:剪切光标所在位置到⾏尾
d^:剪切光标所在位置到⾮空⾏⾸
d0:剪切光标所在位置到⾏⾸,注意0是⼀个数字
dw:剪切⼀个单词,光标⾄下⼀个单词词⾸
de:删除⼀个单词,光标⾄词尾部
db:删除光标所在位置的前⼀个单词
#COMMAND:剪切#个COMMAND的操作,其中COMMAND表⽰以上任意命令,#表⽰⼀个数⼦
dd:剪切光标所在的⾏
#dd:剪切光标所在⾏及以下#⾏,#是数⼦
D:从当前光标位置⼀直删除到⾏尾,留空⾏,等同于d$
p:在当前⾏的下⼀⾏粘贴
P:在当前⾏的上⼀⾏粘贴
复制命令:
y:复制,⾏为类似于d命令
y$:复制光标所在位置到⾏尾
y0:复制光标所在位置到⾏⾸,注意0是⼀个数字
y^:复制光标所在位置到⾮空⾏⾸
ye:复制⼀个单词,光标⾄词尾部
yw:复制⼀个单词,光标⾄下⼀个单词词⾸
yb:复制光标所在位置的前⼀个单词
#COMMAND:复制#个COMMAND的操作,其中COMMAND表⽰以上任意命令,#表⽰⼀个数⼦
yy:复制光标所在的⼀⾏
#y:复制光标所在及以下的#⾏
Y:复制整⾏
改变命令:
c:修改后切换成插⼊模式
c$:删除光标所在处⾄⾏尾,并切换成插⼊模式
c^:删除光标所在处⾄⾮空⽩⾏⾸,并切换成插⼊模式
c0:删除光标所在处⾄⾏⾸,并切换成插⼊模式
cb:删除光标所在位置的前⼀个单词,并切换成插⼊模式
ce:删除⼀个单词光标⾄词尾部,并切换成插⼊模式
cw:删除⼀个单词光标⾄下⼀个单词词⾸,并切换成插⼊模式
#COMMAND:删除#个COMMAND的操作,其中COMMAND表⽰以上任意命令,#表⽰⼀个数⼦
cc:删除当前⾏并输⼊新内容,相当于S
#cc:删除当前⾏及以下#⾏并输⼊新内容
C:删除当前光标到⾏尾,并切换成插⼊模式
2、插⼊模式
插⼊模式实现编辑⽂本内容的功能。
i:光标在当前所在位置并进入插入模式。
I:大写字母i,光标跳转到行首并进入插入模式。
a:光标跳转到当前位置的后面一个字符并进入插入模式。
A:光标跳转到行尾并进入插入模式。
o:光标跳转到下一新行的行首并进入插入模式。
O:光标跳转到上一新行的行首并进入插入模式。
3、扩展命令模式 扩展命令模式能实现保存、退出、强制退出不保存、保存退出、执⾏扩展命令等。
退出:
:w:保存
:q:退出
:q!:强制退出不保存
:wq:保存并退出
:w!:强制保存,分3种情况:
root⽤户
⽂件的owner
当前⽤户对当前⽂件所在⽬录有wx权限时,实际会删除该⽂件再新建。
:x:保存并退出,等价于wq
回到命令模式:
Esc,Esc:连续单击2次
Esc:单击1次,等⼀会
Enter:单击
:r /PATH/FILENAME:读取⽂件内容,将内容输⼊到当前⽂本的最后。
:w /PATH/FILENAME:将当前⽂件内容写⼊另⼀个⽂件。
:!COMMAND:执⾏shell命令显⽰在当前,单击enter键继续编辑⽂本。
:r!COMMAND:执⾏shell命令并把结果复制到光标⾏的下⼀⾏。
:.!COMMAND:执⾏shell命令并把结果复制到当前⾏,替换。
地址定界:
:start_pos,end_pos:定义起始位置和结尾位置之间的⾏
:#:具体第#⾏
:#,#:从左侧#表⽰起始⾏,到右侧#表⽰结尾⾏
:#,+#从左侧#表⽰起始⾏,加上右侧#表⽰的⾏数
:最后⼀⾏
:.,$-1:当前⾏到倒数第⼆⾏
:%:全⽂,相当于1,$
:/pat1/,/pat2/:从第⼀次被pat1模式匹配到的⾏开始,⼀直到第⼀次被pat2模式匹配到的⾏结束
:#,/pat/:从第#⾏到第⼀次被pat1模式匹配到的⾏结束
:/pat/,$:从第⼀次被pat1模式匹配到的⾏开始到⽂本结尾
地址定界使⽤⽅式,后跟⼀个编辑命令
d:选择范围后剪切
y:选择范围后复制
w file:将范围内的⾏另存为⾄指定⽂件中
r file:在指定位置插⼊指定⽂件中的所有内容
撤销更改:
u:撤销最近的更改
#u:撤销之前的#次更改
U:撤销光标落在这⾏后所有的此⾏的更改
Ctrl+r:重做最后的撤销更改
.(点号):重复前⼀个操作
n.:重复前⼀个操作n次
配置⽂件:永久有效
全局有效:/etc/vimrc
个⼈账户有效:~/.vimrc
扩展模式设置:当前vim进程有效
⾏号:
:set number,简写:set nu,表⽰显⽰⾏号
:set nonumber,简写set nonu,表⽰取消⾏号
忽略字符⼤⼩写:
:set ic:启⽤
:set noic:不忽略⼤⼩写
⾃动缩进:
:set ai:启⽤⾃动缩进
set noai:禁⽤⾃动缩进
⾼亮搜索:
:set hlsearch:启⽤
:set nohlsearch:禁⽤
语法⾼亮:
syntax on:启⽤
syntax off:禁⽤
显⽰Tab和换⾏符^I和$显⽰:
set list:启⽤
set nolist:禁⽤
⽂件格式:
:set fileformat=doc:启⽤windows格式
set fileformat=unix:启⽤unix格式
设置⽂本宽度:
:set textwidth=65:设置⾏宽
:set wrapmargin=15:设置⾏边距
设置关闭所在⾏的标识线:
:set cursorline:简写cul:启⽤
:set no cursorline:禁⽤

转载于:https://blog.51cto.com/14322554/2404637

猜你喜欢

转载自blog.csdn.net/weixin_34023863/article/details/91696804