VIM,sek,awk,greb

一、命令行文本编辑器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’

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇