1. vi/vim文本编辑器

vi/vim 这个工具是在 Linux 中的一个文本编辑器,它的使用频率是非常高的。

1.1 模式介绍

vim 编辑器有以下三种模式:

1.2 模式概念

1)命令模式:这种模式也称之为阅读模式,可以控制光标,可以对文本进行查看,但是不能删除文本内容、不能复制粘贴内容等。

2)输入模式:这种模式也叫编辑模式,可以对文件进行复制粘贴、删除。

3)末行模式:它是用于保存、退出、设置编辑环境、查找等。

1.3 常用快捷键

1.3.1 光标移动快捷键

  • w,光标按单个单词来向后移动
  • b,光标按单个单词来向前移动
  • ^,将光标移动到行首位置
  • $,将光标移动到行尾位置
  • G,将光标移动到文件的最后一行,它的前面还可以加一个数字,表示移动到指定的行
  • gg,将光标移动到文件的第一行,它的前面还可以加一个数字,表示移动到指定的行

1.3.2 复制、粘贴、删除

  • yy,复制光标所在行
  • p,将复制到缓冲区中的数据粘贴到光标所在行的下一行位置
  • P,将复制到缓冲区中的数据粘贴到光标所在行的上一行位置
  • Nyy,表示复制从光标所在行向下计算N行来进行复制,即复制N行,这个N必须是一个数字
  • u,撤销当前操作
  • dd,删除光标所在行
  • Ndd,删除从光标所在位置向下计算N行,即删除N行,这个N必须是一个数字
  • d^,删除从光标位置到行首
  • d$,删除从光标位置到行尾

1.3.3 编辑模式快捷键

  • a,将在光标之后插入数据
  • A,将数据插入到光标所在行的末尾
  • o,在光标所在行的下一行插入数据            (✨记住)
  • O,在光标所在行的上一行插入数据
  • i,在光标所在位置之后插前数据
  • I,在光标所在行的行首第一个非空字符前插入数据
  • s,删除光标所在字符并进入插入模式
  • S,删除当前行并进入插入模式
  • r,替换当前光标所在位置的字符                 (✨记住)

1.3.4 末行模式快捷键

  • : , 将命令模式切换为末行模式
  • esc,返回命令模式

 (1)查找替换

  • /关键字,用于在文件是查找指定关键字的内容
  • :s/old/new,将文件中的old替换为new,只替换一次(当前行中找)
  • :s/old/new/g,将文件中的old替换为new,替换全部(当前行中找)
  • :%s/old/new/g,将整个文件中的old替换为new
  • :n1,n2 s/old/new/g,将行号为 n1 和 n2 中的old 替换为 new

(2)保存退出

  • * :wq,保存并退出
  • * :w,保存不退出
  • * :q,退出不保存
  • * :q!,强制退出
  • * :w /dir/file,将当前文件保存到 dir 目录下的 file 文件中
  • * ZZ,保存并退出

(3)其他操作

  • :set nu,显示行号
  • :set nonu,关闭行号
  • :g/word/d,在文件中查找word所在行并删除
  • :r /dir/file,在当前文件中读入 dir 目录下的 file 文件
  • :noh,取消高亮显示

注意:在使用 vim 编辑器时,如果还没有保存就异常退出,则再次使用 vim 打开这个文件时会出现如下的错误:

如何解决?

  1. 首先我们在这个界面中按 q 键来退出。
  2. 然后执行 ls -a 来查看
[root@localhost ~]# ls -a
.                .bash_logout   .cshrc    shell_experiment  testfile.txt  xx
..               .bash_profile  d1        .ssh              .test.swp
anaconda-ks.cfg  .bashrc        .lesshst  .tcshrc           test.txt
.bash_history    .config        passwd    testdir           .viminfo

可以发现:其中多了一个 .text.swp 隐藏文件,我们只需要把这个文件删除即可,就可以使用test文件了。

[root@localhost ~]# rm -f .test.swp

2. 文件内容显示相关命令

2.1 浏览普通文件

2.1.1 cat

作用:查看文件的内容,适合查看数据量较小的文件。

语法:cat  -参数  文件名

参数:

  • -n:显示行号
  • -b:文件中所有非空行增加行号,编号从 1 开始

示例1:

[root@master ~]# vi a.txt
[root@master ~]# cat a.txt 
ni hao

da jia wang shang hao

[root@master ~]# cat -n a.txt
     1    ni hao
     2    
     3    da jia wang shang hao

[root@master ~]# cat -b a.txt
     1    ni hao

     2    da jia wang shang hao

示例2:将显示的结果重定向到另一个文件中

[root@master ~]# cat a.txt > b.txt
[root@master ~]# cat b.txt
ni hao

da jia wang shang hao

示例3:将多个文件的内容合并到一个文件中。

[root@master ~]# echo "hello" > t1.txt
[root@master ~]# echo "world" > t2.txt
[root@master ~]# echo "linux" > t3.txt
[root@master ~]# cat t1.txt t2.txt t3.txt
hello
world
linux
[root@master ~]# cat t1.txt t2.txt t3.txt > t4.txt
[root@master ~]# cat t4.txt
hello
world
linux

2.1.2 tac(了解)

作用:将文件的内容倒叙。

语法:tac    参数    文件名称

示例:

[root@master ~]# cat t4.txt
hello
world
linux

[root@master ~]# tac t4.txt
linux
world
hello

[root@master ~]# cat a.txt
ni hao

da jia wang shang hao
[root@master ~]# tac a.txt
da jia wang shang hao

ni hao

注意:tac 命令只会把文件内容的行号倒叙,不会将每行的内容倒叙。

2.1.3 more

作用:可以显示大文件的翻页查看,适合内容较多的文件。

语法:more    文件名称

示例:

[root@master ~]# more /etc/passwd

注意:按回车可以一行一行查看,按空格可以一页一页的查看,按 q 键退出查看。

2.1.4 less

作用:它的功能与 more 相同,都是查看大内容的文件。

语法:less   文件名称

示例:

[root@master ~]# less /etc/passwd

注意:less 支持使用上下方向键来进行浏览,按 q 退出查看。

2.1.5 head

作用:查看文件前 n 行的内容。

语法:head     参数    文件名称

示例:

[root@master ~]# head /etc/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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

说明:

1. head 命令默认是显示文件的前10行。
2. 如果希望查看文件的指定行数,可以带参数 `head  -数字  文件名称`

[root@master ~]# head -3 /etc/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

2.1.6 tail

作用:查看文件的最后n行的内容,默认为 10 行。

语法:tail   -数字   文件名称

示例:

[root@master ~]# tail /etc/passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/sbin/nologin
sssd:x:997:994:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
chrony:x:996:993:chrony system user:/var/lib/chrony:/sbin/nologin
systemd-oom:x:991:991:systemd Userspace OOM Killer:/:/usr/sbin/nologin
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash

[root@master ~]# tail -3 /etc/passwd
chrony:x:996:993:chrony system user:/var/lib/chrony:/sbin/nologin
systemd-oom:x:991:991:systemd Userspace OOM Killer:/:/usr/sbin/nologin
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash

除了可以查看文件的最后内容以外,我们还可以监视文件的变化。为了演示这个效果,我们需要打开两个终端。

在第一个窗口中输入:

[root@master ~]# touch a.txt
[root@master ~]# echo 1 > a.txt
[root@master ~]# echo 2 > a.txt
[root@master ~]# echo "3" > a.txt
[root@master ~]# echo "4" >> a.txt
[root@master ~]# echo 5 >> a.txt

在第二个窗口中输入:

[root@master ~]# tail -f a.txt
1
tail: a.txt: file truncated
3
4
5

2.2 查看文件信息

 2.2.1 file

作用:查看文件类型。

语法:file    参数   文件名称

类型:

  • ASCII file:ASCII 文本字符文件
  • empty:空文件
  • block special:块设备文件
  • character special:字符设备文件
  • directory:目录

示例:

[root@master ~]# touch test.txt
[root@master ~]# mkdir test
[root@master ~]# ls
a.txt  test  test.txt
[root@master ~]# file test.txt
test.txt: empty
[root@master ~]# file test
test: directory
[root@master ~]# vi c.txt
[root@master ~]# cat c.txt
hello
[root@master ~]# file c.txt
c.txt: ASCII text

2.2.2 stat

作用:显示文件属性信息,即元数据信息。

语法:stat   文件名称

示例:

[root@master ~]# stat c.txt
  File: c.txt
  Size: 6             Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 135162416   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-11-03 19:49:22.665236488 +0800
Modify: 2024-11-03 19:49:15.184268183 +0800
Change: 2024-11-03 19:49:15.184268183 +0800
 Birth: 2024-11-03 19:49:15.184268183 +0800

注意:这个命令可以查看文件大小,块信息,Inode,以及硬链接和软链接信息。

2.3 grep

作用:在文件中搜索指定内容。

语法:grep   参数   查找条件   文件名称

参数:

  • -c:仅显示找到的行数
  • -i:忽略大小写
  • -n:显示行号
  • -v:反向选择,即只显示没有关键字的行
  • -A 数字:搜索时显示匹配到的那一行以及下多少行
  • -B 数字:搜索时显示匹配到的那一行以及上多少行
  • -C 数字:搜索时显示匹配到的那一行以及上下多少行

示例:

# 在文件/etc/passwd搜索含有关键字 root 的行数
[root@master ~]# grep -c 'root' /etc/passwd
2

# 在文件/etc/passwd搜索含有关键字 root 的行,以及行号
[root@master ~]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

# 忽略关键字大小写
[root@master ~]# grep 'Root' /etc/passwd
[root@master ~]# grep -i 'Root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# 搜索不包含 root 关键字的所有行的信息
[root@master ~]# grep -v 'root' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....

# 搜索时显示匹配到的那一行以及下3行
[root@master ~]# grep -A3 'halt' /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

# 搜索时显示匹配到的那一行以及上3行
[root@master ~]# grep -B3 'halt' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

# 搜索时显示匹配到的那一行以及上下3行
[root@master ~]# grep -C3 'halt' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

[root@master ~]# grep -A3 -B3 'halt' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

示例2:使用特殊符号来进行匹配:

[root@master ~]# cat /etc/passwd > passwd

# 在 passwd 查找以 a 开头的所有行
[root@master ~]# grep ^a passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin

# 在 passwd 文件中查找包含 a 的所有行
[root@master ~]# grep a passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
chrony:x:996:993:chrony system user:/var/lib/chrony:/sbin/nologin
systemd-oom:x:991:991:systemd Userspace OOM Killer:/:/usr/sbin/nologin
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash


[root@master ~]# echo hello123 >> passwd
[root@master ~]# tail -3 passwd
systemd-oom:x:991:991:systemd Userspace OOM Killer:/:/usr/sbin/nologin
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash
hello123
# 在passwd文件中查找以数字结尾的所有行
[root@master ~]# grep "[0-9]$" passwd
hello123

# 在passwd文件中搜索所有空行
[root@master ~]# grep ^$ passwd


2.4 cut

作用:用于按列提取文本内容。

语法:cut   -d   分隔符    -f   列数   文件名称

示例1:在 passwd 文件中保存用户数据信息时,每一项值都是采用冒号(:)分隔的,我们可以从文件获取用户名。

[root@master ~]# head -2 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

这个文件中一共有7个字段,它们分别表示如下:

  • 第一个字段表示用户名
  • 第二个字段表示该用户对应的密码占位符
  • 第三个字段表示该用户的ID
  • 第四个字段表示该用户的组ID
  • 第五个字段表示用户的其他信息
  • 第六个字段表示用户的家目录
  • 第七个字段表示用户可执行的脚本

我们的需求是获取用户名,即第一个字段。

[root@master ~]# cut -d ":" -f 1 passwd
root
bin

daemon
adm

# 也可以写成如下形式
[root@master ~]# cut -d: -f1 passwd
root
bin

daemon
adm

示例2:提取内核版本号

[root@master ~]# uname -a
Linux master 5.14.0-362.8.1.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Oct 3 11:12:36 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux

# 和管道符接合使用,获取内核版本号
[root@master ~]# uname -a | cut -d" " -f3
5.14.0-362.8.1.el9_3.x86_64

示例3:提取IP地址

[root@master ~]# ip a | grep "inet 192" | cut -d" " -f6
192.168.72.70/24

示例4:提取mac地址

[root@master ~]# ip a | grep link/ether | cut -d" " -f6
00:0c:29:8b:3d:9e

2.5 sort

作用:用于对文本内容进行排序显示。

语法:sort   参数   文件名称

参数:

  • -f:忽略大小写
  • -b:忽略缩进与空格
  • -n:以数值型排序
  • -r:反向排序
  • -u:去除重复行
  • -t:指定分隔符
  • -k:设置字段范围

示例:

# 准备数据
[root@master ~]# vi fruit.txt 
[root@master ~]# cat fruit.txt 
banana
pear
apple
pear
orange
pear
# 对文件内容进行排序
[root@master ~]# sort fruit.txt 
apple
banana
orange
pear
pear
pear
# 去重复
[root@master ~]# sort -u fruit.txt 
apple
banana
orange
pear

# 准备数据
[root@master ~]# vi number.txt
[root@master ~]# cat number.txt 
45
12
3
98
82
67
24
56
9
# 数字排序,默认是以自然顺序来进行排序的。
[root@master ~]# sort number.txt 
12
24
3
45
56
67
82
9
98
# 实现数值排序,使用 -n 参数来按照数值的从小到大排序
[root@master ~]# sort -n number.txt 
3
9
12
24
45
56
67
82
98
# 实现数值排序,使用 -n 参数来按照数值的从大到小排序
[root@master ~]# sort -nr number.txt 
98
82
67
56
45
24
12
9
3

2.6 uniq

作用:用于去除文本中重复的行。

语法:uniq    参数    文件名称

示例:

# 准备数据
[root@master ~]# vi uniq.txt
[root@master ~]# cat uniq.txt 
welcome to center
welcome to center
welcome to center
red hat certified system administrator
free linux lessions
# 去掉文件中重复行后再显示
[root@master ~]# uniq uniq.txt
welcome to center
red hat certified system administrator
free linux lessions

2.7 tr

作用:从标准输入中读取数据,经过替换或者删除后,将结果输出到标准输出中显示。

语法:tr    参数    被替换内容    新内容

参数:

  • -c:反选设定字符,符合“被替换内容”的部分不做处理,不符合的剩余部分才进行转换。
  • -d:删除指令字符
  • -s:缩减连续重复的字符成指定的单个字符。

示例1:将小写字母全部转换为大写字母。

[root@master ~]# cat fruit.txt 
banana
pear
apple
pear
orange
pear

# 将小写字母转换为大写字母
[root@master ~]# cat fruit.txt  | tr a-z A-Z
BANANA
PEAR
APPLE
PEAR
ORANGE
PEAR

示例2:提取IP地址。

# 方式一
[root@master ~]# ip a | grep "inet 192" | cut -d" " -f6
192.168.72.70/24

# 方式二
[root@master ~]# ip a | grep ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.72.70/24 brd 192.168.72.255 scope global noprefixroute ens160
[root@master ~]# ip a | grep ens160 | cut -d/ -f1
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.72.70
[root@master ~]# ip a | grep ens160 | cut -d/ -f1 | tr -s ' '
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
 inet 192.168.72.70
[root@master ~]# ip a | grep ens160 | cut -d/ -f1 | tr -s ' ' | cut -d" " -f3
<BROADCAST,MULTICAST,UP,LOWER_UP>
192.168.72.70

2.8 wc

作用:统计指定文本文件的行数、字数或者字节数。

语法:wc     参数     文件名称

参数:

  • -l:只显示行数
  • -w:只显示单词数
  • -c:只显示字节数

示例:

# 默认会显示行数、单词数、字节数
[root@master ~]# wc passwd 
  29   44 1070 passwd

# 只显示行数
[root@master ~]# wc -l passwd 
29 passwd
# 只显示单词数
[root@master ~]# wc -w passwd 
44 passwd
# 只显示字节数
[root@master ~]# wc -c passwd 
1070 passwd

2.9 cp

作用:复制文件或目录(copy)

语法:cp    参数    源文件    目标文件

参数:

  • -a:在复制文件时保留文件的属性,如,链接、属性
  • -d:拷贝时保留链接
  • -f:在覆盖已经存在的目标文件时不提示
  • -i:交互式的复制
  • -p:除复制源文件的内容外,还将其修改的时间和访问时间也复制到新的文件中,即复制文件的元数据信息
  • -r:如果是复制目录则会将其子目录和子文件一同复制

示例:

[root@master ~]# rm -rf *
[root@master ~]# touch t1.txt
[root@master ~]# cp t1.txt t2.txt
[root@master ~]# ls
t1.txt  t2.txt
[root@master ~]# mkdir d1
[root@master ~]# touch d1/a1.txt
[root@master ~]# mkdir d2
[root@master ~]# cp d1 d2
cp: -r not specified; omitting directory 'd1'
[root@master ~]# cp -r d1 d2
[root@master ~]# tree d2
[root@master ~]# ls d2
d1

[root@master ~]# cp t1.txt t2.txt
cp: overwrite 't2.txt'? yes
[root@master ~]# cp -nf t1.txt t2.txt

2.10 mv

作用:用于移动或才剪切文件或目录。(move)

语法:move    参数    源文件名称    目标文件名称

示例:

[root@master ~]# ls
d1  d2  t1.txt  t2.txt
[root@master ~]# mkdir d3
[root@master ~]# ls d3
# 将 t1.txt 文件移动到 d3 目录下
[root@master ~]# mv t1.txt d3
[root@master ~]# ls
d1  d2  d3  t2.txt
[root@master ~]# ls d3
t1.txt

# 移动文件并重命名文件
[root@master ~]# mv t2.txt d3/t2.avi
[root@master ~]# ls
d1  d2  d3
[root@master ~]# ls d3
t1.txt  t2.avi

# 重命令文件
[root@master ~]# mv d2 d22
[root@master ~]# ls
d1  d22  d3

# 将d1目录移动到d3目录下
[root@master ~]# mv d1 d3
[root@master ~]# ls
d22  d3
[root@master ~]# ls d3
d1  t1.txt  t2.avi

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐