一、命令行文本编辑器vi、vim
1、什么是vi编辑器
可以理解为windows下面的文本编辑器,比如记事本,比如word文档。
vi编辑器通常被简称为vi,而vi又是visual editor的简称。它在Linux上的地位就像Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。
vi 编辑器并不是一个排版程序,它不像Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。没有菜单,只有命令,且命令繁多。
2、为何要用vi编辑器
1.修改配置
2.写脚本
3、vi编辑器操作模式
1、命令行模式:在编辑模式下按下ESC键返回命令行模式。
vi的默认模式。在这一模式中,所有的输入被解释成vi命令,可以执行修改、复制、移动、粘贴和删除正文等命令,也可以进行移动光标、搜索字符串和退出vi的操作等。
2、编辑/插入模式:输入a、i、o之一
在编辑模式中,可以往一个文件中输入正文。在这一模式下,输入的每一个字符都被vi编辑器解释为输入的正文。使用ESC键返回命令行模式。
a:进入插入模式并在光标之后进行添加。
i:进入插入模式并在光标之前进行插入。
o:进入插入模式并在当前(光标所在)行之下开启新的一行。
3、扩展/末行模式:输入冒号:
在一些UNIX系统上也叫最后一行模式。在这一模式下,可以使用一些高级编辑命令,如搜寻和替代字符串、存盘或退出vi编辑器等。要进入最后一行模式,需要在命令行模式中输入冒号(:),冒号这一操作将把光标移到屏幕的最后一行。
4、操作汇总
vi ===> vim 文件编辑器
# vim /boot/grub2/grub.cfg
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
命令模式:
a. 光标定位
hjkl
0到行开头 $到行尾
gg 移动到文件第一行 G 移动到文件最后一行
3G 进入第三行
/string(n N 可以循环的) 快速定位到某一行
行定位:
%:定位到所有行
1,5: 1到5行
,8 : 首先光标要移动到某一行,以这一行为起始一直到第8行
2,$ : 从第二行到最后一样
b. 文本编辑(少量)
y 复制光标所在行 yy 3yy复制光标向下3行 ygg从第一行复制到光标所在行 yG从第一行复制到最后 (以行为单位)
d .删除 dd 3dd dgg dG (以行为单位)
p 粘贴
x 删除光标所在的字符
D 从光标处删除到行尾
u undo撤销
^r redo重做
r 可以用来修改一个字符
c. 进入其它模式
a 进入插入模式
i 进入插入模式
o 进入插入模式
A 进入插入模式
: 进入末行模式
^v 进入可视块模式
R 进入替换模式
插入模式:
^p 唯一补齐
末行模式:
a. 保存退出
:10 进入第10行
:w 保存
:q 退出
:wq 保存并退出
:w! 强制保存
:q! 不保存并退出
:wq! 强制保存退出
😡 保存并退出
b. 查找替换
:范围 s/old/new/选项
:1,5 s/Note/yyy/ 从1-5行的Note 替换为yyy
:5,$ s/Note/yyy/ $表示最后一行
:1,$ s/to/xxx/g = :% s/to/xxx/g %表示全文 g表示全局
:4,9 s/^#// 4-9行的以#开头的替换为空
:% s#/dev/sda#/var/ccc#g
:,8 s/to/xxx/ 从当前行到第8行
特殊服务转义+替换:
:%s /\/a\/b\/c\/1\.txt/\/mmm\/111\.txt/g
c. 读入文件/写文件
:w
:w /aaa.txt 另存为/aaa.txt
:1,3 w /2.txt
:1 w! /root/ccc.txt 如果目标文件已经存在则需要加!号
:r /etc/hosts
d. 设置环境
临时设置:
:set nu 设置行号
:set ic 不区分大小写
:set ai 自动缩进
:set list
:set nonu 取消设置行号
:set noic
永久的环境:
/etc/vimrc 影响所有系统用户
~/.vimrc 影响某一个用户
# vim ~/.vimrc # 在家目录下新增一个文件,输入下述内容
set ic
set nu
# vim -O /etc/hosts /etc/grub.conf ^w 按两次切换
# vimdiff grub.conf /etc/grub.conf 对比文件,^w 按两次切换
# vim -p /etc/hosts /etc/grub.conf ^PgUp, ^PgDn
比对两个文件
diff -u aaa.txt bbb.txt
以aaa.txt的内容作为参照,看一下bbb.txt有何变动
diff -u bbb.txt aaa.txt
二、sed:
概念
1、stream editor流式编辑器,不会一下子把文件内容全部读入内容
而是读一行到内存处理一行,然后再读下一行
2、非交互式编辑修改文本文件内容
sed的用法:
sed ‘定位+命令’ a.txt
定位的方式:
行定位:
1
1,3
正则定位:
/^egon/
/egon$/
/egon/
行定位+正则定位
1,3
1,/egon/
指定具体的某几行
sed ‘1p;3p;5p’ 1.txt
sed ‘1p;3d;5p’ 1.txt
命令:
p 打印
d 删除
s///g
举例:
sed ‘1p’ a.txt
sed ‘1,3p’ a.txt
sed ‘1,3d’ a.txt
sed ‘1,3s/xxx/yyy/g ‘ a.txt
sed是支持管道符号
ps aux | sed ‘1,50d’ # 可以处理一个命令的输出结果
如何写入文件:加一个选项-i
-i: 把输出到屏幕中的内容覆盖写入文件
sed -i ‘1,3p’ 1.txt
试验:
[root@www ~]# cat 1.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@www ~]#
[root@www ~]# sed '' 1.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@www ~]#
[root@www ~]# sed -n '' 1.txt # -n取消掉默认打印
# 定位到第一行进行打印
[root@www ~]# sed '1p' 1.txt
egon1111
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@www ~]# sed -n '1p' 1.txt
egon1111
# 行号-范围匹配
[root@www ~]# sed '1,3p' 1.txt
egon1111
egon1111
22222egon
22222egon
3333egon33333
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@www ~]#
[root@www ~]# cat 1.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
正则匹配
[root@www ~]# sed '/egon$/p' 1.txt
egon1111
22222egon
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
6666egon6666egon666egon
行号+正则
sed '1,/xxx/p' 1.txt # 从第一行到最近一次匹配/xxx/的行截止
[root@www ~]# cat 1.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@www ~]#
[root@www ~]#
[root@www ~]# sed '1,/xxx/p' 1.txt
egon1111
egon1111
22222egon
22222egon
3333egon33333
3333egon33333
4444xxx44444
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
# 删除命令
[root@www ~]# cat 1.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@www ~]#
[root@www ~]#
[root@www ~]# sed '2d' 1.txt
egon1111
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@www ~]#
[root@www ~]# sed '1p;2d;5p' 1.txt
egon1111
egon1111
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
5555xxx55555xxxx555xxx
6666egon6666egon666egon
# 替换命令
sed '1,3 s/egon/EGON/g'
[root@www ~]# cat 1.txt
egon1111
22222egon
3333egon33egon333egon
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@www ~]#
[root@www ~]# sed '1,3s/egon/EGON/g' 1.txt
EGON1111
22222EGON
3333EGON33EGON333EGON
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
# 不写定位定位所有行
sed ‘s/egon/EGON/g’ 1.txt
# 行号定位+正则定义
[root@www ~]# cat 1.txt
egon1111
22222egon
3333egon33egon333egon
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@www ~]#
[root@www ~]#
[root@www ~]# sed '1,/egon$/ s/egon/EGON/g' 1.txt
EGON1111
22222EGON
3333egon33egon333egon
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
三、awk命令:
格式化输出,针对的是有规律的文本文件
语法:
awk -F’:’ ‘定位+命令’ /etc/passwd
-F: 指定分隔符,不指定默认以空格为分割符
定位方式:
1、行号
NR==5
NR>=1 && NR<=3
NR<=3 || NR >= 5
2、正则定位
/正则表达式/
命令:
{print }
awk的运行逻辑:
awk -F’:’ ‘NR>=1 && NR<=3{print $1}’ /etc/passwd
1、读入文本的一行内容,进行处理
(1)先把这行内容整体赋值给一个变量$0
(2)以冒号为分隔符对该行进行分割
第一段内容 –赋值给—》$1
第二段内容 –赋值给—》$2
第三段内容 –赋值给—》$3
(3)把行号赋值NR变量
(4)把这一行分的段数赋值给变量NF
2、执行规则’NR>=1 && NR<=3{print $1}’
3、后续就是重复1,2步直到处理完文件的所有行
练习:
针对文件/etc/passwd
1、取第三行后,第1列与第2列
awk -F’:’ ‘NR>3{print $1,$2}’ /etc/passwd
awk -F’:’ ‘NR>3{print $1″——“$2}’ /etc/passwd
2、取第一行与第五行的最后一列
awk -F’:’ ‘NR==1 || NR==5{print $NF}’ a.txt
awk -F’:’ ‘NR==1 || NR==5{print $(NF-1)}’ a.txt
补充:[root@www ~]# awk -F’:’ ‘{print NR,$1,NF}’ a.txt
3、取root开头的行的,第1列与第三列
awk -F’:’ ‘/^root/{print $1,$3}’ a.txt
4、第一列内容等于root的行,打印出第1、3列
awk -F: ‘$1 == “root”{print $1,$3}’ a.txt
5、第一列内容是r开头的行,打印出第1、3列
awk -F: ‘$1 ~ /^r/ {print $1,$3}’ a.txt
6、最后一列内容是bash结尾的行,打印出第1、3列
awk -F: ‘$NF ~ /bash$/ {print $1,$3}’ a.txt
7、第一列内容不是r开头的行,打印出第1、3列
awk -F: ‘$1 !~ /^r/ {print $1,$3}’ a.txt
8、awk命令也支持管道符号
ps aux结果的前十行,取pid与command列
ps aux | awk ‘NR<=10{print $2,$NF}’
补充:默认分隔符是1个或多个空格,案例如下
[root@www ~]# cat b.txt
四、grep命令:
过滤文本或者过滤命令的结果
用法:
grep 选项 ‘正则’ 文件路径
命令 | grep 选项 ‘正则’
选项:
-n:加上行号
-i: 忽略大小写
-rl: 递归过滤某个文件夹,把匹配成果文件路径展示出来
grep -rl ‘root’ /a
-v:取反
[root@www ~]# grep ‘111’ 1.txt
111
[root@www ~]# grep -v ‘111’ 1.txt
222
333
444
[root@www ~]# cat 1.txt
111
222
333
444
正则表达式
grep ‘^root’ a.txt
grep ‘root$’ a.txt
练习:
过滤某个进程
ps aux |grep ‘sleep’
过滤某个进程,然后去掉grep命令本身产生的进程
ps aux |grep ‘sleep’ | grep -v ‘grep’
ps aux |grep ‘[s]leep’