【5.0】Linux之文件管理
【一】系统目录结构
【1】文件组织方式
- Windows: 以多根的方式组织文件 C: D:
- Linux:以单根的方式组织文件 /
【2】存放命令相关的目录
- /bin:
- 存放普通用户使用的命令
- 比如
- /bin/ls用于列出当前目录的文件和文件夹
- /bin/date用于显示系统日期和时间。
- /sbin:
- 存放管理员使用的命令
- 比如
- /sbin/service用于管理系统服务
- /sbin/poweroff用于关机
- /sbin/useradd用于添加用户。
- 可以根据路径中的"bin"来识别存放可执行文件的目录。
【3】which 命令名
- 使用which命令可以查找某个命令所在的路径
- 例如which ls能够显示ls命令所在的路径。
- 但是较为全面的信息可以使用whereis命令
- 它不仅可以显示命令所在的路径,还可以显示可执行文件、帮助文档等的位置。
【4】存放用户相关数据的家目录
比如:windows不同的用户登陆系统显示的桌面背景不一样
/home,普通用户的家目录, 默认为/home/dream
环境变量的东西不要删,删掉试一下
/root,超级管理员root的家目录, 普通用户无权操作
- 家目录用于存放用户的个人数据
- 在Linux系统中
- 普通用户的家目录默认为/home/username(username为具体的用户名)。
- 超级管理员root的家目录为/root。
- 环境变量等与用户相关的配置信息也存放在家目录中。
【5】系统文件目录
- /usr,相当于C:Windows
- /usr/local,软件安装的目录,相当于C:Program
- /usr/bin/,普通用户使用的应用程序(重要)
- /usr/sbin,管理员使用的应用程序(重要)
- /usr/lib,库文件Glibc 32bit
- /usr/lib64,库文件Glibc 64bit
- /usr:类似于Windows的C:Program Files,用于存放系统相关的文件和目录。
- /usr/local:用于存放本地安装的软件,相当于C:Program Files。
- /usr/bin/:存放普通用户使用的应用程序,如常用的命令工具。
- /usr/sbin:存放管理员使用的应用程序,包含一些系统管理工具。
- /usr/lib:存放库文件,特指Glibc 32位版本。
- /usr/lib**:存放不同硬件架构的库文件。
【6】启动目录
- /boot 存放的系统启动相关的文件,例如:kernel,grub(引导装载程序)
- linux内核+GUN软件
【7】配置文件目录
- /etc,极其重要,后续所有服务的配置都在这个目录中
- /etc/sysconfig/network-script/ifcfg-,网络配置文件
- /etc/hostname,系统主机名配置文件,主机名很重要,有些特殊服务要依赖主机名,没有主机名会报错起不来;修改了要重启:reboot
- /etc/resolv.conf,dns客户端配置文件,域名解析服务器,一般我们不配置,因为网卡的配置好了,会覆盖掉它,网卡的优先级高
- /etc/hosts,本地域名解析配置文件,域名解析,先找自己的hosts,再去域名解析
- /etc/motd :登录后显示的信息
-
/etc目录中存放着系统的各种配置文件,这是一个非常重要的目录。
-
下面是一些常见的配置文件:
-
/etc/sysconfig/network-script/ifcfg-:网络配置文件。
-
/etc/hostname:系统主机名配置文件,修改主机名后需要重启系统。
-
/etc/resolv.conf:DNS客户端配置文件,用于设置域名解析服务器。
-
/etc/hosts:本地域名解析配置文件,可用于自定义域名解析。
-
/etc/motd:登录后显示的信息。
- 更多个性登录显示内容参考:https://github.com/abcfy2/motd
【8】可变的目录与临时目录
- /var,存放一些变化文件,比如/var/log/下的日志文件,登陆日志,可以用来查看登录日志等信息
- /var/tmp,进程产生的临时文件
- /tmp,系统临时目录(类似于公共厕所),谁都可以使用
- 1 查看登陆日志
- cat /var/log/secure #查看登陆时间
- 2 进程产生的临时文件(360清理垃圾,就是会清理)
【9】设备目录文件
- /dev,存放设备文件,比如硬盘,硬盘分区,光驱,等等
- /dev/sd 硬盘设备
- /dev/null,黑洞设备,只进不出。类似于垃圾回收站
- /dev/random,生成随机数的设备
- /dev/zero,能远远不断的产生数据,类似于取款机,随时随地取钱
【10】虚拟的文件系统(如对应的进程停止则/proc下对应目录则会被删除)
- /proc,反映系统当前进程的实时状态 :process
- PS:类似于小汽车的仪表板,能够看到汽车是否有故障,或者是否缺油了
- ls /proc # 可以看到很多id号,pid号,进程号,唯一
- ls 进程id号的文件夹
- 如果进程被关闭,id号的文件夹就没了
- id号每次启动都不唯一,只有一个进程唯一,systemd 是进程号1的进程,所有进程都是基于它派生出来的
【11】其他
(1)media:提供设备的挂载点,媒体文件
- linux 新增了盘符,需要手动挂载
- 把光盘里的数据,挂载到media目录
mount /dev/cdrom /media/
(2)mnt:提供设备的挂载点(同上)
(3)opt:第三方工具,第三方软件默认安装的(mysql...)
(4)run :下有pid,log结尾的文件
ls /run
- cat /run/sshd.pid可以查看SSH服务的进程号
cat sshd.pid # 进程运行的pid号,放在文件中
- 过滤进程
ps aux |grep sshd
- 此外,.lock文件在运行时起到锁定的作用,防止并发操作。
- 如果有其他进程占用了锁,则会等待锁释放后再执行相应操作。
- 假设现在执行
yum install tree
再开一个窗口执行相同命令
yum install tree
'''
Another app is currently holding the yum lock; waiting for it to exit...
The other application is: yum
Memory : 71 M RSS (470 MB VSZ)
Started: Tue Aug 18 00:26:31 2020 - 00:24 ago
State : Sleeping, pid: 6191
'''
cat /run/yum.pid
【补充】动态链接库文件
- win上能看到 xx.dll
- linux上能看到 xx.so
- 在Linux系统中
- C和C++编写的程序经过编译后会产生两种文件
- 一种是可执行文件
- 另一种是动态链接库文件
- C和C++编写的程序经过编译后会产生两种文件
- 动态链接库文件的扩展名为.so,而Windows系统中对应的文件是.dll。
- 动态链接库提供了一组函数的实现,可以被不同的程序共享使用,减少了代码重复性,提高了程序的可维护性和更新性。
【二】文件路径定位
【1】相对/绝对路径
-
在Linux中,文件路径可以使用相对路径或绝对路径来定位。
-
以下是关于相对路径和绝对路径的解释:
-
相对路径:
- 相对路径是相对于当前文件或者目录的路径。
- 它是以当前位置为参考点来指定文件或目录的路径。
- 使用相对路径时,可以省略根目录符号(/)。
-
绝对路径:
- 绝对路径是从根路径(/)开始的路径。
- 它可以直接指明文件或目录的完整路径,并不依赖于当前位置。
-
-
对于相对路径,可以使用以下示例进行说明:
# 当前路径为/home/user/
cd Documents # 进入当前路径下的Documents目录
cd ./Pictures # 进入当前路径下的Pictures目录
cd ../Music # 进入当前路径上级目录的Music目录
- 对于绝对路径,可以使用以下示例进行说明:
cd /usr/local/bin # 进入绝对路径为/usr/local/bin的目录
cd /var/log # 进入绝对路径为/var/log的目录
cd /home/user/Desktop # 进入绝对路径为/home/user/Desktop的目录
- 需要注意的是,/bin、/sbin、/lib目录都以软链接的形式链接到了/usr目录下。
- 因此,在访问这些目录时,使用绝对路径时应该指向软链接所指向的目标目录
- 示例如下:
cd /bin # 实际上会跳转到/usr/bin目录
cd /sbin # 实际上会跳转到/usr/sbin目录
cd /lib # 实际上会跳转到/usr/lib目录
【2】. 和 .. 的区别
-
在Linux中,.(点)和..(两个点)有特殊的含义:
-
. 表示当前路径。
- 可以使用它来指代当前所在的目录。
-
.. 表示上一层目录。
- 可以使用它来指代当前目录的父级目录。
-
-
示例:
ls . # 显示当前目录的内容
cd .. # 进入当前目录的上级目录
cp file.txt .. # 将当前目录的file.txt文件拷贝到上级目录
【3】cd切换文件操作
-
cd命令是用于切换当前工作目录的命令。
-
以下是cd命令的常用选项:
-
cd:切换到当前用户的家目录(例如:/home/user)。对于root用户和普通用户,家目录是不同的。
-
cd -:切换回上一次所在的目录。
-
cd ~:切换到当前用户的家目录。与cd命令不带参数的效果相同。
-
cd .:代表当前目录。可以在拷贝、移动等操作中使用该命令。
-
cd ..:切换到当前目录的上级目录。
-
-
示例:
cd /etc # 切换到/etc目录
cd - # 返回上一次所在的目录
cd ~ # 切换回当前用户的家目录
cd . # 当前目录保持不变,一般用于拷贝、移动操作
cd .. # 切换到当前目录的上级目录
【三】创建/复制/移动/删除
【1】文件创建命令touch
# touch file # 无则创建,有则修改时间
touch file
# 创建名为 "file" 的文件,如果该文件已存在,则更新文件的访问和修改时间为当前时间。
# touch file2 file3
touch file2 file3
# 同时创建名为 "file2" 和 "file3" 的文件。
# touch /home/test/file4 file5
touch /home/test/file4 file5
# 在 "/home/test/" 目录下创建名为 "file4" 的文件,以及当前工作目录下创建名为 "file5" 的文件。
# touch file{a,b,c}
touch file{a,b,c}
# 创建名为 "filea"、"fileb" 和 "filec" 的文件。
# touch file{1..10}
touch file{1..10}
# 创建名为 "file1"、"file2"、...、"file10" 的文件。
# touch file{a..z}
touch file{a..z}
# 创建名为 "filea"、"fileb"、...、"filez" 的文件。
# rm -rf fil* #把fil开头的全删除
rm -rf fil*
# 强制递归删除当前目录中所有以 "fil" 为开头的文件和目录。
- touch 命令用于创建空文件或者更新文件属性。
- 如果文件已经存在,touch 命令会修改文件的访问和修改时间为当前时间
- 如果文件不存在,则创建一个新文件。
- 花括号
{}
可以用来创建一系列相关的文件名。- 通配符
*
用于匹配任意字符,可以与 rm 命令结合使用,删除满足特定模式的文件或目录。
- 在示例中,命令
rm -rf fil*
删除所有以 "fil" 开头的文件和目录。
[root@dream ~]# cd /home
[root@dream home]# mkdir test
[root@dream home]# ls
admin meng test
[root@dream home]# cd test/
[root@dream test]# ls
[root@dream test]# touch file
[root@dream test]# ls
file
[root@dream test]# touch file2 file3
[root@dream test]# ls
file file2 file3
[root@dream test]# touch /home/test/file4 file5
[root@dream test]# ls
file file2 file3 file4 file5
[root@dream test]# touch file{a,b,c}
[root@dream test]# ls
file file2 file3 file4 file5 filea fileb filec
[root@dream test]# touch file{1..10}
[root@dream test]# ls
file file10 file3 file5 file7 file9 fileb
file1 file2 file4 file6 file8 filea filec
[root@dream test]# rm -rf fil*
[root@dream test]# ls -l
total 0
【2】目录创建命令mkdir
# 选项:-v 显示详细信息 -p 递归创建目录
# mkdir dir1
mkdir dir1
# 在当前目录下创建名为 "dir1" 的目录。
# mkdir /home/test/dir2
mkdir /home/test/dir2
# 在 "/home/test" 目录下创建名为 "dir2" 的目录。
# mkdir -v /home/test/{dir3,dir4}
mkdir -v /home/test/{dir3,dir4}
# 在 "/home/test" 目录下同时创建名为 "dir3" 和 "dir4" 的目录,并显示创建过程的详细信息。
# mkdir -pv /home/test/dir5/dir6
mkdir -pv /home/test/dir5/dir6
# 递归地创建目录结构。在 "/home/test" 目录下创建 "dir5" 目录,在 "dir5" 目录下创建 "dir6" 目录。如果父级目录不存在,也会被创建。
# 同时,显示创建过程的详细信息。
# mkdir -pv /home/{test/{diu,but},boy}
mkdir -pv /home/{test/{diu,but},boy}
# 递归地创建目录结构。在 "/home" 目录下创建 "test" 和 "boy" 目录,在 "test" 目录下创建 "diu" 和 "but" 目录。
# 如果父级目录不存在,也会被创建。同时,显示创建过程的详细信息。
- mkdir 命令用于创建一个新的目录。
- 选项
-v
表示显示详细信息,可以查看创建过程的输出。- 选项
-p
表示递归地创建目录结构,即如果父级目录不存在,也会被创建。- 花括号
{}
可以用来创建一系列相关的目录名。- 在示例中,使用
-v
选项可以查看创建过程的详细信息,使用-p
选项可以递归地创建目录结构。
[root@dream test]# ls -l
total 0
[root@dream test]# mkdir dir1
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
[root@dream test]# mkdir /home/test/dir2
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root 6 Aug 21 11:01 dir2
[root@dream test]# # mkdir -v /home/test/{dir3,dir4}
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root 6 Aug 21 11:01 dir2
[root@dream test]# mkdir -v /home/test/{dir3,dir4}
mkdir: created directory ‘/home/test/dir3’
mkdir: created directory ‘/home/test/dir4’
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root 6 Aug 21 11:01 dir2
drwxr-xr-x. 2 root root 6 Aug 21 11:02 dir3
drwxr-xr-x. 2 root root 6 Aug 21 11:02 dir4
[root@dream test]# mkdir -pv /home/test/dir5/dir6
mkdir: created directory ‘/home/test/dir5’
mkdir: created directory ‘/home/test/dir5/dir6’
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root 6 Aug 21 11:01 dir2
drwxr-xr-x. 2 root root 6 Aug 21 11:02 dir3
drwxr-xr-x. 2 root root 6 Aug 21 11:02 dir4
drwxr-xr-x. 3 root root 18 Aug 21 11:02 dir5
[root@dream test]# mkdir -pv /home/{test/{diu,but},boy}
mkdir: created directory ‘/home/test/diu’
mkdir: created directory ‘/home/test/but’
mkdir: created directory ‘/home/boy’
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:02 but
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root 6 Aug 21 11:01 dir2
drwxr-xr-x. 2 root root 6 Aug 21 11:02 dir3
drwxr-xr-x. 2 root root 6 Aug 21 11:02 dir4
drwxr-xr-x. 3 root root 18 Aug 21 11:02 dir5
drwxr-xr-x. 2 root root 6 Aug 21 11:02 diu
[root@dream test]#
【3】以树状显示目录结构命令tree
- 安装插件
yum install tree
- 命令
# 选项: -L: 显示目录树的层级
# tree /home/test/ #显示当前目录下的结构
/home/test/
├── but
├── dir1
├── dir2
├── dir3
├── dir4
├── dir5
│ └── dir6
└── diu
- tree命令用于以树状形式显示目录结构,可以清晰展示文件和子目录的层次关系。
- 通过安装
tree
插件,我们可以在Shell中使用tree
命令。- 在示例中,使用
tree /home/test/
命令可以显示/home/test/
目录下的内容。- 结果以树状结构展示,包括目录和子目录,并使用缩进表示层级关系。
[root@dream test]# tree /home/test/
/home/test/
├── but
├── dir1
├── dir2
├── dir3
├── dir4
├── dir5
│ └── dir6
└── diu
8 directories, 0 files
【4】cp复制
#选项: -v:详细显示命令执行的操作 -r: 递归处理目录与子目录 -p: 保留源文件或目录的属性
# cp file /tmp/file_copy
cp file /tmp/file_copy
# cp name /tmp/name #不修改名称
# cp file /tmp/ #不修改名称
# cp -p file /tmp/file_p #-p保持原文件或目录的属性
# cp -r /etc/ /tmp/ #复制目录需要使用-r参数, 递归复制
# cp -rv /etc/hosts /etc/hostname /tmp #拷贝多个文件至一个目录
# cp -rv /etc/{hosts,hosts.bak}
# cp -rv /etc/hosts{,-org}
cp
命令用于复制文件或目录。- 在示例中,
cp file /tmp/file_copy
将当前目录下的file
文件复制到/tmp/
目录下,并命名为file_copy
。- 如果文件已经存在于目标位置,文件内容会被覆盖。
- 如果目标路径是一个目录,则将源文件复制到目标目录下,并保持相同的文件名。
- 使用
-v
选项可以显示详细的操作信息。- 若要复制目录及其子目录,需要使用
-r
递归处理目录与子目录。- 使用
-p
选项可以保留原文件或目录的属性,包括权限、所有者等。- 如果源文件是一个目录,需使用
-r
参数进行递归复制。- 可以同时复制多个文件至一个目录,如示例中的
cp -rv /etc/hosts /etc/hostname /tmp
。- 还可以使用花括号展开功能进行复制,例如
cp -rv /etc/{hosts,hosts.bak}
可以一次复制多个文件。- 类似地,使用花括号展开功能可以修改复制的文件名,如示例中的
cp -rv /etc/hosts{,-org}
将/etc/hosts
复制并重命名为/etc/hosts-org
。
【5】mv移动
# mv file file1 #原地移动算改名
# mv file1 /tmp/ #移动文件至tmp目录
# mv /tmp/file1 ./ #移动tmp目录的文件至当前目录
# mv dir/ /tmp/ #移动目录至/tmp目录下
# touch file{1..3}
# mv file1 file2 file3 /opt/ #移动多个文件或至同一个目录
# mkdir dir{1..3}
# mv dir1/ dir2/ dir3/ /opt #移动多个目录至同一个目录
mv
命令用于移动文件或目录,并可以同时用来重命名文件或目录。- 在示例中,
mv file file1
将当前目录下的file
文件重命名为file1
。- 如果目标文件名已存在,则会被覆盖。
- 如果目标路径是一个目录,则将源文件移动到目标目录,并保持相同的文件名。
- 如果源路径和目标路径都是在同一个文件系统下,那么
mv
命令只是更改了文件名,实际上并没有对文件内容进行移动操作。这种情况下,可以将mv
看作是文件重命名的一种方式。- 如果目标路径和源路径不在同一个文件系统下,那么
mv
命令会在两个文件系统之间,通过复制和删除的方式来完成文件的移动操作。- 此外,
mv
命令还可以同时移动多个文件或目录至同一个目录,如示例中的mv file1 file2 file3 /opt/
可以将file1
、file2
和file3
这三个文件移动到/opt/
目录下。- 同样地,可以将多个目录移动至同一个目录,如示例中的
mv dir1/ dir2/ dir3/ /opt
。
【6】rm删除
# rm file.txt #删除文件, 默认rm存在alias别名,rm -i所以会提醒是否删除文件
rm file.txt
-
执行结果:
- 根据提示输入
y
或n
来确认是否删除文件。
- 根据提示输入
rm
命令用于删除文件或目录。- 在示例中,
rm file.txt
将删除当前目录下的file.txt
文件。- 如果使用默认的
rm
命令,它通常带有-i
选项的别名,即每次删除都会提示是否确认删除。因此,在执行命令后会得到一个提示rm: remove regular file 'filename'?
,需要输入y
或n
来确认是否删除文件。- 可以通过添加
-f
选项来强制删除文件,不再进行确认操作。- 注意,删除后的文件将无法恢复,请谨慎使用。
# rm -r dir/ #递归删除目录,会提示
rm -r dir/
-
执行结果:
- 根据提示输入
y
或n
来确认是否删除目录及其内容。
- 根据提示输入
- 使用
-r
选项可以递归删除目录及其下的所有文件和子目录。- 在示例中,
rm -r dir/
将会删除当前目录下的dir
目录及其内容。- 与删除文件一样,当使用默认的
rm
命令删除目录时,也会进行确认提示。因此,在执行命令后会得到一个提示rm: remove directory 'dirname'?
,需要输入y
或n
来确认是否删除目录及其内容。- 类似地,可以通过添加
-f
选项来强制删除目录,不再进行确认操作。
# rm -rf dir/ #强制删除目录,不提醒(慎用)
rm -rf dir/
-
执行结果:
- 将强制删除目录及其内容,不再进行确认提示。
- 当使用
-f
和-r
选项的组合-rf
时,可以强制删除目录及其下的所有文件和子目录,而无需进行确认操作。- 注意,使用
-rf
选项非常危险,请谨慎使用。一旦删除,无法恢复。
# rm -f /home/dir10/ //不包括隐藏文件
rm -f /home/dir10/
-
执行结果:
- 删除
/home/dir10/
目录,但不包括隐藏文件。
- 删除
- 使用
rm -f
命令删除目录时,默认情况下不会删除目录中的隐藏文件,只会删除非隐藏文件和子目录。- 在示例中,
rm -f /home/dir10/
只会删除/home/dir10/
目录中的非隐藏文件,而隐藏文件.file4
不会被删除。- 使用
-r
选项可以递归删除目录及所有文件和子目录,包括隐藏文件。
# rm -rf file
rm -rf file
-
执行结果:
- 递归地强制删除名为
file
的文件。
- 递归地强制删除名为
- 使用
-rf
选项可以同时进行递归删除和强制删除操作。- 在示例中,
rm -rf file
将递归地强制删除当前目录下名为file
的文件。- 类似地,可以使用
-rf
选项来递归地强制删除指定的目录。注意,这种操作也非常危险,请谨慎使用。
【四】查看文件内容(cat tac less more head tail tailf grep …)
【1】cat
# cat [文件名]
cat
命令用于查看文件内容。- 通过给定的文件名作为参数,
cat
命令会将文件的内容输出到终端。
# cp /etc/passwd ./pass
# cat pass #正常查看文件方式
# cat -n pass #-n显示文件有多少行
# cat -A pass #查看文件的特殊符号,比如文件中存在tab键
# tac pass #倒序查看文件
【2】less、more
# less [文件名]
# more [文件名]
less
和more
是用于逐页查看长文本文件的命令。- 使用这两个命令可以按页浏览文件,支持上下翻动、空格进行翻页,并且可以随时退出查看。
# less /etc/services #使用光标上下翻动,空格进行翻页,q退出
# more /etc/services #使用回车上下翻动,空格进行翻页,q退出(有百分比)
【3】head
# head [文件名]
# head -n [行数] [文件名]
head
命令用于查看文件的头部内容,默认显示前十行。- 通过指定
-n
参数,可以查看文件的指定行数的头部内容。
# head pass #查看头部内容,默认前十行
# head -n5 pass #查看头部5行,使用-n指定
# ps aux | head -5 # 只看头部5个进程
【4】tail
# tail [文件名]
# tail -n [行数] [文件名]
# tail -f [文件名]
# tailf [文件名]
tail
命令用于查看文件的尾部内容,默认显示最后10行。- 通过指定
-n
参数,可以查看文件的指定行数的尾部内容。tail -f
可以动态地查看文件尾部的变化,并不断更新显示新的内容。tailf
命令与tail -f
功能相同,但是在某些系统中更常用。
# tail pass # 查看文件尾部,默认10行
# tail -20 /var/log/secure # 查看文件尾部20行
# tail -f /var/log/messages #-f动态查看文件尾部的变化
# tailf /var/log/messages #查看文件尾部的变化
# ps aux | tail -2
【5】grep过滤文件内容
# grep [模式] [文件名]
# grep -i [模式] [文件名]
# grep -Ei [模式1|模式2] [文件名]
# grep -n -A [行数] [模式] [文件名]
# grep -n -B [行数] [模式] [文件名]
# grep -n -C [行数] [模式] [文件名]
grep
命令用于在文件中按模式搜索匹配的行,并将其打印输出。- 通过指定
-i
参数可以忽略大小写进行匹配。- 通过
-E
参数可以启用扩展正则表达式匹配。- 使用
-n
参数可以显示匹配行的行号。-A
参数可以指定在匹配行之后显示的额外行数。-B
参数可以指定在匹配行之前显示的额外行数。-C
参数可以指定在匹配行前后都要显示的额外行数。
# grep "^root" pass #匹配以root开头的行
# grep "bash$" pass #匹配以bash结尾的行
# grep -i "ftp" pass #忽略大小写匹配
# grep -Ei "sync$|ftp" pass #匹配文件中包含sync结尾或ftp字符串
# grep -n -A 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的下2行
# grep -n -B 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上2行
# grep -n -C 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上下2行
【6】上翻/下翻
control+b :下翻
control+f :上翻
control+b
可以向下翻页。control+f
可以向上翻页。
【五】联网下载文件(wget、curl)
- 可以使用
wget
或curl
命令在终端中联网下载文件。
【1】使用wget命令下载文件
wget
命令用于从指定的URL下载文件,并保存到本地。- 以下是
wget
命令的基本用法:
wget [选项] [URL]
- 其中,
[选项]
可以根据需要进行设置,[URL]
是要下载文件的地址。- 你也可以使用
-O
选项来指定文件的保存路径和名称。
- 安装
wget
命令:
yum install wget -y
- 示例:使用
wget
下载文件
wget -O /path/to/save/file http://example.com/file.zip
- 以上命令将从
http://example.com/file.zip
下载文件,并保存到指定路径/path/to/save/file
。
【2】使用curl命令下载文件
curl
命令可以用于通过URL获取文件内容,并将其输出到终端或保存到本地文件。- 以下是
curl
命令的基本用法:
curl [选项] [URL]
- 其中,
[选项]
可以根据需要进行设置,[URL]
是要下载文件的地址。- 你可以使用
-o
选项指定文件的保存路径和名称。
- 安装
curl
命令:
yum install curl -y
- 示例:使用
curl
下载文件
curl -o /path/to/save/file http://example.com/file.zip
- 以上命令将从
http://example.com/file.zip
下载文件,并保存到指定路径/path/to/save/file
。
【六】文件上传与下载(rz、sz)
- 你可以使用
rz
和sz
命令在终端中进行文件上传和下载。
【1】使用rz命令上传文件
-
rz
命令可以用于上传文件到远程服务器。它允许你从本地计算机选择文件,并将其传输到远程服务器的当前工作目录。- 为了使用
rz
命令,你需要确保你已经在远程服务器上安装了lrzsz
软件包。
- 为了使用
-
安装
lrzsz
软件包:
yum install lrzsz -y
- 示例:使用
rz
命令上传文件
rz # 只能上传文件文件上传(不能大于4g)
- 运行以上命令后,会出现一个文件选择对话框,你可以在本地计算机上选择要上传的文件。
- 选中文件后,文件将被传输到远程服务器的当前工作目录。
- 注意:
rz
命令只能用于上传文件,不能上传大于4GB的文件。
【2】使用sz命令下载文件
-
sz
命令用于从远程服务器下载文件到本地计算机。-
它允许你选择要下载的文件,并将其保存到本地指定的路径。
-
为了使用
sz
命令,你需要确保你已经在远程服务器上安装了lrzsz
软件包。
-
-
安装
lrzsz
软件包:
yum install lrzsz -y
- 示例:使用
sz
命令下载文件
sz /path/to/file # 只能下载文件
- 运行以上命令后,远程服务器上指定路径的文件将被下载到本地计算机,并保存在当前工作目录中。
- 注意:
sz
命令只能用于下载文件。
- 请注意,rz和sz命令必须在支持sz / rz协议的终端或终端模拟器中运行以正常工作。
- 这种协议用于在终端和远程计算机之间传输文件。
【七】文件或命令查找(locate、which、whereis、find)
【1】locate文件查找
# locate /etc/sh #搜索etc目录下所有以sh开头的文件
# locate -i /etc/sh #搜索etc目录下,所有以sh开头的文件,忽略大小写
# locate /etc/sh
- 这个命令用于在整个文件系统中搜索以
sh
开头的文件。- 它会快速定位到匹配的文件路径并显示出来。
# locate -i /etc/sh
-
加上
-i
参数后,locate
命令会忽略大小写,即不区分大小写地搜索以sh
开头的文件。 -
案例:
$ locate /etc/sh
/etc/share
/etc/shells
- 上述示例展示了搜索结果,显示了路径匹配到的文件或目录。
【2】which命令查找
# which ls #查找ls命令的绝对路径
# whereis ls //查找命令的路径、帮助手册、等
# whereis -b ls //仅显示命令所在的路径,仅看二进制
# 对于内核相关的一些命令,用which whereis 是无法查询到的,需要使用type采查询
# type -a ls #查看命令的绝对路径(包括别名)
# type -a for
# which ls
- 该命令用于找到
ls
命令的绝对路径。- 当你在终端输入某个命令时,系统会根据环境变量的路径来寻找对应的可执行文件,并返回找到的可执行文件的完整路径。
# whereis ls
whereis
命令用于查找命令的路径、帮助手册等相关信息。- 它会返回命令所在的二进制文件路径、源代码路径和帮助文档路径。
# whereis -b ls
- 使用
-b
选项,whereis
命令只会显示命令所在的二进制文件路径,而不会显示其他信息。
# type -a ls
-
type
命令可以查看命令的绝对路径,包括命令的别名或函数。- 使用
-a
选项可以显示所有匹配到的命令。
- 使用
-
案例:
$ which ls
/bin/ls
$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
$ whereis -b ls
/bin/ls
$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
- 以上示例展示了四个命令分别查找
ls
命令的不同结果。which
命令返回了ls
命令的绝对路径/bin/ls
。whereis
命令返回了ls
命令的二进制文件路径/bin/ls
和帮助文档路径/usr/share/man/man1/ls.1.gz
。type -a
命令显示了ls
命令的别名ls --color=auto
和绝对路径/bin/ls
。
【3】find命令
- 用于在Linux系统中按照指定的条件查找文件和目录。
- 它具有很多灵活的参数,可以根据文件名、类型、大小、日期等多种条件来搜索。
(1)基本语法:
find <路径> <表达式> <动作>
<路径>
:指定要搜索的路径。可以是目录的路径,也可以是文件的路径。<表达式>
:定义了要搜索的条件。<动作>
:指定在找到匹配的文件后需要执行的操作。
(2)根据文件名搜索:
find /path/to/search -name "filename"
- 例如,要在
/home
目录下找到所有名为file.txt
的文件,可以使用如下命令:
find /home -name "file.txt"
(3)根据类型搜索:
find /path/to/search -type <类型>
-
类型
可以是以下之一:-
f
:普通文件 -
d
:目录 -
l
:符号链接 -
b
:块设备 -
c
:字符设备 -
s
:套接字 -
p
:管道
-
-
例如,要在当前目录下找到所有的目录,可以使用如下命令:
find . -type d
(4)根据文件大小搜索:
find /path/to/search -size <大小>
-
<大小>
可以用于定义具体的大小,如+100M
表示大于100MB,或用于比较操作符,如-size +10k
表示大于10KB。 -
例如,要查找所有大于1GB的文件,可以使用如下命令:
find / -size +1G
(5)根据时间搜索:
find /path/to/search -<时间类型> <时间>
-
<时间类型>
可以是以下之一:-
-atime
:访问时间 -
-mtime
:修改时间 -
-ctime
:改变时间
-
-
<时间>
可以用于定义具体的时间- 如
-7
表示7天前,或用于比较操作符 - 如
-mtime +30
表示30天前的文件。
- 如
-
例如,要查找30天内修改过的文件,可以使用如下命令:
find /path/to/search -mtime -30
【八】字符处理命令(sort、uniq、cut、sed、awk、wc、)
【1】sort命令排序
- sort命令用于对文本文件进行排序。
sort [OPTION]... [FILE]...
# -r:以倒序方式排序
# -n:按照数字排序
# -t:指定分隔符,默认为空格
# -k:指定排序的列
# 示例案例:
# 创建一个文件,写入无序内容
$ cat >> file.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF
# 对文件内容进行排序
$ sort file.txt
a:4
b:3
c:2
d:1
e:5
f:11
# 使用特定分隔符和指定列进行排序
$ sort -t ":" -k2 file.txt
d:1
f:11
c:2
b:3
a:4
e:5
# 按照数字进行排序
$ sort -t ":" -n -k2 file.txt
d:1
c:2
b:3
a:4
e:5
f:11
# 更多示例:
# 下载文件 http://fj.xuliangwei.com/public/ip.txt,并对文件进行排序
$ sort -t. -k3.1,3.1nr -k4.1,4.3nr ip.txt
【2】uniq命令去重
- uniq命令用于去除文件中相邻重复的行,并可统计重复行的次数。
uniq [OPTION]... [INPUT [OUTPUT]]
# -c:计算重复行的次数
# 示例案例:
# 创建一个file.txt文件
$ cat >> file2.txt <<EOF
abc
123
abc
123
EOF
# 使用sort和uniq组合,去除相邻重复的行
$ cat file.txt | sort | uniq
123
abc
# 使用-c参数统计每行内容的重复次数
$ cat file.txt | sort | uniq -c
2 123
2 abc
【3】cut命令截取字段
- cut命令用于截取文件中的字段。
cut OPTION... [FILE]...
# -d:指定分隔符
# -f:指定需要提取的列
# 示例案例:
# 假设有一个文件file.txt包含以下内容:"Im lqz, is QQ 306334678"
# 我们希望过滤出文件中的lqz和306334678部分
# 使用cut命令,指定空格为分隔符,提取第2列和第5列
$ cut -d " " -f2,5 file.txt
# 使用cut、sed结合,将逗号替换为空格
$ cut -d " " -f2,5 file.txt | sed 's#,##g'
# 使用sed、awk结合,将逗号替换为空格
$ sed 's#,# #g' file.txt | awk -F " " '{print $2 " " $5}'
# 使用awk命令直接提取指定列
$ awk '{print $2,$5}' file.txt
# 使用awk命令指定分隔符提取指定列
$ awk '{print $2,$5}' file.txt | awk -F "," '{print $1,$2}'
【4】sed命令替换
- sed命令用于在文本中进行文字替换。
sed 's###g'
# 示例案例:
# 假设有一个file.txt文件包含以下内容:"Im lqz, is QQ 306334678"
# 需要将逗号替换为空格
# 使用cut命令提取出逗号部分,并使用sed进行替换
$ cut -d " " -f2,5 file.txt | sed 's#,##g'
【5】awk命令提取字段
- awk命令用于提取和处理文本中的字段。
awk '{print $2,$5}' file.txt
# -F 指定分隔符
awk '{print $2,$5}' file.txt | awk -F "," '{print $1,$2}'
# 示例案例:
# 假设有一个file.txt文件包含以下内容:"Im lqz, is QQ 306334678"
# 需要提取出lqz和306334678部分
# 使用awk命令提取指定列
$ awk '{print $2,$5}' file.txt
# 使用awk命令指定分隔符提取指定列
$ awk '{print $2,$5}' file.txt | awk -F "," '{print $1,$2}'
【6】wc命令统计行数
- wc命令用于统计文件中的行、字节和单词数。
wc [OPTION]... [FILE]...
# -l:显示文件行数
# -c:显示文件字节数
# -w:显示文件单词数
# 示例案例:
# 统计/etc/fstab文件有多少行
$ wc -l /etc/fstab
# 统计/etc/services文件有多少行
$ wc -l /etc/services
# 统计当前路径下的文件和文件夹数量
$ ls | wc -l
# 更多示例:
# 使用grep结合wc命令统计文件行数
$ grep -n "." /etc/services | tail -1
# 使用awk结合wc命令统计文件行数
$ awk '{print NR " " $0}' /etc/services | tail -1
# 使用cat结合wc命令统计文件行数
$ cat -n /etc/services | tail -1
【九】系统文件属性
【1】十列文件属性的解释
- 当使用
ls -l
命令来列出目录下的文件时,输出结果以长格式显示,包含了文件的详细信息,我们称之为文件属性。 - 下面是十列文件属性的解释:
[root@lqz ~]# ls -l ks.cfg
-rw-------. 1 root root 4434 May 30 13:58 ks.cfg
-rw-------.
:①第一个字符表示文件类型,-
表示普通文件;后面的rw-------
表示文件权限,其中rw-
代表所有者(root)有读写权限,后面的-------
代表其他用户没有任何权限。
1
:②文件的硬链接次数。此处为1,表示该文件有1个硬链接。
root
:③文件所属用户。此处是root,表示该文件属于root用户。
root
:④文件所属组。此处是root,表示该文件属于root用户组。
4434
:⑤文件的大小(单位为字节)。此处是4434字节,表示该文件的大小为4434字节。
May 30 13:58
:⑥至⑦表示最新修改的日期和时间。此处的日期是5月30日,时间是13:58。
ks.cfg
:⑨文件或目录的名称。此处是文件名为ks.cfg。
【2】回顾ls
命令:
-
ls
:列出目录内容的命令。 -
-l
:以长格式显示文件信息的选项。 -
ks.cfg
:要显示信息的文件名。 -
下面是一个实际的例子,演示如何使用
ls -l
命令来查看文件属性:
$ ls -l test.txt
-rw-r--r-- 1 user1 group1 1024 Aug 20 09:30 test.txt
- 以上命令输出了
test.txt
文件的属性:-
-rw-r--r--
:文件类型为普通文件,所有者有读写权限,所属组和其他用户只有读权限。 -
1
:文件的硬链接次数为1。 -
user1
:文件所属用户为user1。 -
group1
:文件所属组为group1。 -
1024
:文件的大小为1024字节。 -
Aug 20 09:30
:文件的最新修改日期为8月20日09:30。 -
test.txt
:文件的名称为test.txt。
-
【十】系统文件类型
【1】ls
命令
- 使用
ls
命令以长格式显示文件属性,通过第一列的第一个字符来判断文件具体的类型。 - 下面是示例命令及其结果:
$ ll -d /etc/hosts /tmp /bin/ls /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client
-rwxr-xr-x. 1 root root 117656 Jun 30 2016 /bin/ls # 普通文件
srw-rw-rw-. 1 root root 0 Jan 20 10:35 /dev/log # 套接字文件
brw-rw----. 1 root disk 8, 0 Jan 20 10:36 /dev/sda # 设备文件(块设备)
crw--w----. 1 root tty 4, 1 Jan 20 10:36 /dev/tty1 # 设备文件(字符设备)
lrwxrwxrwx. 1 root root 22 Jan 13 11:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg # 链接文件
-rw-r--r--. 1 root root 199 Jan 20 11:03 /etc/hosts # 普通文件
prw-------. 1 root root 0 Jan 20 10:36 /run/dmeventd-client # 管道文件
drwxrwxrwt. 61 root root 8192 Jan 21 13:01 /tmp # 目录文件
【2】file
file
命令可以更精确地判断文件类型。下面是示例命令及其结果:
$ file /etc/hosts
/etc/hosts: ASCII text # 文本文件
$ file /bin/ls
/bin/ls: ELF **-bit LSB executable, x86-**, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=aa7ff68f13de25936a098016243ce57c3c982e06, stripped # 可执行文件
$ file /dev/sda
/dev/sda: block special # 设备文件(块设备)
$ file /dev/tty1
/dev/tty1: character special # 设备文件(字符设备)
$ file /etc/grub2.cfg
/etc/grub2.cfg: broken symbolic link to `../boot/grub2/grub.cfg' # 链接文件
$ file /home
/home: directory # 目录文件
$ file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe) # 管道文件
$ file but
but: Zip archive data, at least v1.0 to extract # 压缩文件
- 综上所述,通过使用
ls
和file
命令可以准确地判断文件的类型。 - 需要注意的是,Linux文件扩展名并不代表文件类型,仅为了更好地识别文件的类型。
【3】小结
-rw-r--r--. 1 root root 35 7月 27 10:33 dream.txt
-rw-r--r--.
- 第一个
-
表示文件类型(一会讲),后面的rwx,表示权限
- 第一个
1
- 硬链接次数
root
- 文件属于哪个用户
root
- 文件属于哪个组
87811
- 文件大小
7月 27 10:33
- 最新修改的时间与日期
dream.txt
- 文件或目录名称
ll -d /etc/hosts /tmp /bin/ls /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client
-
- 普通文件(文本, 二进制, 压缩, 图片, 日志等)
d
- 目录文件
b
- 设备文件(块设备)存储设备硬盘 /dev/sda1, /dev/sda2
c
- 设备文件(字符设备),终端 /dev/tty1, /dev/zero
s
- 套接字文件, 进程间通信(socket)
p
- 管道文件
l
- 链接文件
【十一】系统链接文件
【1】引入
- 文件有文件名与数据,在Linux上被分成两个部分:
- 用户数据 (user data)
- 即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为Block
- 元数据 (metadata)
- 即文件的附加属性,如文件大小、创建时间、所有者等信息。我们称其为Inode
- 用户数据 (user data)
- 在Linux中,inode是文件元数据的一部分但其并不包含文件名,inode号即索引节点号)
- 文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
- 图1.展示了程序通过文件名获取文件内容的过程。
- Linux 系统引入了两种链接:
- 硬链接 (hard link)
- 软链接(又称符号链接,即 soft link 或 symbolic link)
ll -i
- 查看inode
【2】什么是软链接
- 软连接---》复制一份inode信息(win的快捷方式)
- 软链接相当于Windows的快捷方式,软链接文件会将inode指向源文件的block,当我们访问这个软链接文件时,其实访问的是源文件本身。
- 那么当我们对一个文件创建多个软链接,其实就是多个inode指向同一个block。
- 当我们删除软链接文件时,其实只是删除了一个inode指向,并不会对源文件源文件造成影响,但如果删除的是源文件则会造成所有软链接文件失效。
【3】什么是硬链接
- 硬连接---》只是复制了一份文件名
- 若一个inode号对应多个文件名,则称这些文件为硬链接。
- 换言之,硬链接就是同一个文件使用了多个别名
- 如下图hard link 就是 file 的一个别名,他们有共同的 inode。
【4】软链接实践
(1)文件软链接
# 创建一个文件
touch /root/file
# 创建文件的软链接
ln -s /root/file /tmp/file_bak
# 查看软链接的属性
ls -l /tmp/file_bak
- 在上面的示例中,我们创建了一个名为
file
的文件,并在/tmp
目录下创建了一个名为file_bak
的软链接,指向原始文件/root/file
。- 使用
ls -l
命令,我们可以查看软链接的详细属性。
(2)目录软链接
# 创建一个目录
mkdir /soft/nginx1.1 -p
# 创建目录的软链接
ln -s /soft/nginx1.1/ /soft/nginx
# 查看软链接的指向
ls -l /soft/nginx
- 在上面的示例中,我们创建了一个名为
nginx1.1
的目录,并在/soft
目录下创建了一个名为nginx
的软链接,指向原始目录/soft/nginx1.1
。- 同样地,我们可以使用
ls -l
命令来查看软链接的指向。
(3)软链接的使用场景
- 软件升级:
- 在升级软件时,可以使用软链接将新版本的文件链接到旧版本的位置,从而实现无缝升级。
- 企业代码发布:
- 在企业代码发布过程中,可以使用软链接将代码库的不同版本链接到不同的服务器目录,以便实现快速切换和回滚。
- 不方便目录移动:
- 当某些目录由于某种原因不能直接移动时,可以使用软链接将目录链接到其他位置,以达到相同的效果
#
touch /root/file
ln -s /root/file /tmp/file_bak
ll /tmp/file_bak //root下file链接到/tmp下并重命名为file_bak
#目录软链接示例
mkdir /soft/nginx1.1 -p
ln -s /soft/nginx1.1/ /soft/nginx
ll /soft/nginx //查看链接指向
#软链接使用场景
1.软件升级
2.企业代码发布
3.不方便目录移动
【5】硬链接实践
#文件硬链接示例
ln /root/file /tmp/file_hard
ll /tmp/file_hard
#PS:目录不能创建硬链接,硬链接文件可以用rm命令删除
(1)硬链接
# 创建文件的硬链接
ln /root/file /tmp/file_hard
# 查看硬链接的属性
ls -l /tmp/file_hard
- 在上面的示例中,我们使用
ln
命令创建了一个名为file_hard
的硬链接,与原始文件/root/file
指向相同的inode。- 使用
ls -l
命令,我们可以查看硬链接的详细属性。
【6】硬链接与软链接区别
1)ln命令创建硬链接,ln -s命令创建软链接。
2)目录不能创建硬链接,并且硬链接不可以跨越分区系统。
3)目录软链接特别常用,并且软链接支持跨越分区系统。
4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。
5)删除软链接文件,对源文件及硬链接文件无任何影响。
6)删除文件的硬链接文件,对源文件及链接文件无任何影响。
7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。
8)删除源文件及其硬链接文件,整个文件会被真正的删除。
(1)ln命令创建硬链接,ln -s命令创建软链接。
- 硬链接(Hard Link):
- 硬链接是通过ln命令创建的链接。
- 它们直接连接到文件的inode,并且与原始文件有相同的inode编号。
- 硬链接可以看作是多个文件名指向同一块数据的不同入口。
- 例如,创建硬链接的命令如下:
$ ln source_file hard_link
- 软链接(Symbolic Link):
- 软链接也称为符号链接,它是通过ln -s命令创建的链接。
- 软链接是一个特殊的文件,其中包含指向源文件的路径信息。
- 软链接实际上是一个指向原始文件的快捷方式。
- 例如,创建软链接的命令如下:
$ ln -s source_file soft_link
(2)目录不能创建硬链接,并且硬链接不可跨越分区系统。
-
硬链接:
- 目录不能创建硬链接,硬链接只能链接到文件。
-
软链接:
- 软链接可以链接到目录,并且支持跨越分区系统。
- 这意味着你可以在不同的分区之间创建软链接,并且访问目标目录的内容。
(3)目录软链接特别常用,并且软链接支持跨越分区系统。
-
硬链接:
- 由于目录不能创建硬链接,所以硬链接在目录方面使用较少。
-
软链接:
- 软链接在目录方面非常有用。
- 通过软链接,你可以创建一个指向其他目录的快捷方式,方便快速访问。
(4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。
-
硬链接:
- 硬链接是通过inode来连接到真正的文件数据的,所以硬链接的inode和源文件的inode是相同的。
-
软链接:
- 软链接是一个指向原始文件的路径信息,因此软链接的inode与源文件的inode是不同的。
(5)删除软链接文件,对源文件及硬链接文件无任何影响。
- 软链接:
- 当删除软链接时,只删除链接文件本身,并不影响源文件或硬链接文件。
- 源文件和其他硬链接文件仍然存在。
$ rm soft_link
(6)删除文件的硬链接文件,对源文件及链接文件无任何影响。
- 硬链接:
- 当删除文件的硬链接时,源文件和其他硬链接文件仍然存在,并不受影响。
$ rm hard_link
(7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。
-
硬链接:
- 当删除链接文件的源文件时,硬链接并不受影响,并且仍然可以访问源文件的数据。
-
软链接:
- 当删除软链接指向的源文件时,软链接将失效,因为它指向的文件不存在了。
(9)删除源文件及其硬链接文件,整个文件会被真正删除。
- 硬链接:
- 当删除源文件以及所有硬链接文件时,文件的数据才会真正删除,释放磁盘空间。
$ rm source_file hard_link
【十二】Vim功能介绍
【1】什么是VIM
-
vi和vim是Linux下的一个文本编辑工具
-
VIM(Vi IMproved)是Linux下的一个文本编辑工具,相当于Windows系统下的记事本或Word文档。
-
它是Vi编辑器的增强版。
【2】为什么要使用VIM?
- 因为Linux系统一切皆为文件,而我们工作最多的就是修改某个服务的配置(其实就是修改文件内容)。
- 也就是说如果没有vi/vim,我们很多工作都无法完成。
- PS: vim是学习linux最重要的命令之一
【3】VI与VIM有什么区别?
- vi和vim都是文本编辑器,只不过vim是vi的增强版,比vi多了语法高亮显示,其他编辑功能几乎无差,所以使用vi还是vim取决个人习惯。(相当于windows系统下的文本编辑软件“记事本”与”notepad++”的区别)
- PS:因为前期最小化安装CentOS系统,所以默认情况下没有vim命令
- 但可以使用yum install vim -y安装
【4】如何使用VIM编辑器?
- 在使用VIM之前,我们需要先介绍下VIM的三种模式:
- 普通模式、编辑模式、命令模式
- 每种模式分别支持多种不同的快捷键,要想高效率地操作文本,就必须先搞清这三种模式的操作区别以及模式之间的切换方法。
【5】VIM模式三种模式介绍
1.普通模式:
- 主要是控制光标移动,可对文本进行复制、粘贴、删除等工作。
- 使用vim filename 编辑一个文件时,一进入该文件就是普通模式了。
- 在这个模式下,可以进行光标移动、复制、删除、粘贴操作。
2.编辑模式:
- 主要进行文本内容编辑和修改
- 从普通模式进入编辑模式,只需你按一个键即可(i, I, a, A, o, O)
- 当进入编辑模式时,会在屏幕的最下一行会出现 “INSERT”标记
- 从编辑模式回到普通模式只需要按键盘左上方的 ESC 键即可。
3.末行模式:
- 主要用于保存或退出文本。
- 在普通模式下,输入 “:” 或者 “/“ 即可进入命令模式。
- 在命令该模式下,可进行的操作有,显示行号、搜索、替换、保存、退出。
【6】vim编辑打开文件整体流程
- 1.默认打开文件处于普通模式
- 2.从普通模式切换至编辑模式需要使用a、i、o
- 3.编辑模式修改完毕后需要先使用ECS返回普通模式
- 4.在普通模式输入”:”或”/“进入命令模式,可实现文件的保存与退出。
- PS: 在vim中,无法直接从编辑模式切换到命令模式。
【十三】VIM模式使用
【1】普通模式
(1)命令光标跳转
G #光标跳转至末端
gg #光标跳转至顶端
5gg #光标跳转至当前文件内的第5行
$ #光标跳转至当前光标所在行的尾部
0 #光标跳转至当前光标所在行的首部
G
:跳转至文件末尾gg
:跳转至文件开头Ngg
:跳转至当前文件内的第N行$
:跳转至当前行的末尾^
或者0
:跳转至当前行的开头
(2)文件内容较多
ctrl+f #往下翻页(行比较多)
ctrl+b #往上翻页
ctrl+f
:向下翻页(适用于行数较多的情况)ctrl+b
:向上翻页
(3)复制与粘贴
yy #复制当前光标所在的行
5yy #复制当前光标以及光标向下4行
p #粘贴至当前光标下一行
P #粘贴至当前光标上一行
yy
:复制当前行Nyy
:复制当前行及往下的N-1行p
(小写):粘贴至当前光标下一行P
(大写):粘贴至当前光标上一行
(4)删除、剪贴、撤销
dd #删除当前光标所在的行
4dd #删除当前光标所在的行及往下的3行
dG #删除当前光标以后的所有行
D #删除当前光标及之后的内容
x #删除当前光标标记之后的字符
X #删除当前光标标记之前的字符
dd & p #剪切、先删除dd(number dd),后粘贴p
u #撤销上一次操作
dd
:删除当前行Ndd
:删除当前行及往下的N-1行dG
:删除当前光标后的所有行D
:删除当前光标及之后的内容x
:删除当前光标后的字符X
:删除当前光标前的字符u
:撤销上一次操作
(5)替换
r #替换当前光标标记的单个字符
R #进入REPLACE模式,连续替换,ESC结束
r
:替换当前光标标记的单个字符R
:进入REPLACE模式,连续替换(按ESC键结束)
【2】编辑模式(从普通模式进入到编辑模式)
i #进入编辑模式,光标不做任何操作
a #进入编辑模式,将当前光标往后一位
o #进入编辑模式,并在当前光标下添加一行空白内容
I #进入编辑模式,并且光标会跳转至本行的头部
A #进入编辑模式,将光标移动至本行的尾部
O #进入编辑模式,并在当前光标上添加一行空白内容
i
:在当前光标位置前插入a
:在当前光标位置后追加o
:在当前光标下插入一行空白内容I
:在当前行首插入A
:在当前行尾追加O
:在当前行上方插入一行空白内容
【3】命令模式(主要用于搜索/保存/退出文件)
(1)文件保存与退出
:w #保存当前状态
:w! #强制保存当前状态
:q #退出当前文档(文档必须保存才能退出)
:q! #强制退出文档不会修改当前内容
:wq #先保存再退出
:wq! #强制保存并退出
:x #先保存再退出
ZZ #保存退出, shfit+zz
:number #跳转至对应的行号
:set nu #显示行号
:set nonu #不显示行号
:w
:保存当前状态:w!
:强制保存当前状态:q
:退出当前文档(需要先保存):q!
:强制退出文档(不保存):wq
:先保存再退出:wq!
:强制保存并退出:x
:先保存再退出ZZ
:保存并退出文件(快捷方式,按Shift+zz)
(2)文件内容查找
/string #需要搜索的内容(查找)
n #按搜索到的内容依次往下进行查找
N #按搜索到的内容依次往上进行查找
/string
:搜索指定内容的字符串n
:顺序向下查找匹配内容N
:顺序向上查找匹配内容
(3)文件内容替换
:1,5s#sbin#test#g #将1-5行中所有的 "sbin" 替换为 "test"
:1,5s#sbin#test# #将1-5行中第一个出现的 "sbin" 替换为 "test"
:%s#sbin#test#g #将整个文件中所有的 "sbin" 替换为 "test"
:%s#sbin#test#gc #全局替换并提示是否需要替换
- 这些命令用于在Vim编辑器中进行文件内容的替换操作。
- 替换命令的基本语法是
:[range]s/pattern/replacement/[flags]
- 其中
pattern
是要查找的内容replacement
是要替换成的内容flags
是可选的标志。
- 示例: 假设有以下文本文件内容:
1. sbin
2. sbin
3. sbin
4. sbin
5. sbin
- 执行命令
:1,5s#sbin#test#g
后,文件变为:
1. test
2. test
3. test
4. test
5. test
- 执行命令
:1,5s#sbin#test#
后,文件变为:
1. test
2. sbin
3. sbin
4. sbin
5. sbin
- 执行命令
:%s#sbin#test#g
后,文件变为:
1. test
2. test
3. test
4. test
5. test
- 执行命令
:%s#sbin#test#gc
后,将逐个匹配替换,提示是否替换:
1. test (y/n/a/q/l/^E/^Y)?
- 在提示中
- 可以选择替换(y)
- 不替换并进入下一个匹配(n)
- 替换所有剩余的匹配(a)
- 结束替换过程(q)
- 向后查找匹配(l)
- 向前查找匹配(^E)
- 显示剩余的匹配(^Y)
(4)文件内容另存
:w /root/test.txt #将当前文件内容另存为 /root/test.txt 文件
- 这个命令用于将当前编辑的文件内容另存为指定的文件。
- 使用
:w
命令可以将文件保存,后面跟上文件路径即可另存为指定路径的文件。- 示例:
- 假设当前正在编辑一个名为
example.txt
的文件,并且想将其另存为/root/test.txt
- 执行命令
:w /root/test.txt
即可将文件内容保存到/root/test.txt
。
(5)文件内容读入
:r /etc/hosts #将 /etc/hosts 文件的内容插入到当前光标所在行的下面
:5r /etc/hosts #将 /etc/hosts 文件的内容插入到当前文件的第五行下面
- 这些命令用于将指定文件的内容读入到当前编辑的文件中。
- 示例:
- 假设当前正在编辑一个文件,并且要在当前光标所在行的下面插入
/etc/hosts
文件的内容 - 执行命令
:r /etc/hosts
即可实现。
- 假设当前正在编辑一个文件,并且要在当前光标所在行的下面插入
- 假设当前正在编辑一个文件,并且要将
/etc/hosts
文件的内容插入到当前文件的第五行下面- 执行命令
:5r /etc/hosts
即可实现。
- 执行命令
【4】视图模式(从普通模式进入视图模式),主要进行批量操作
(1)ctrl+v 进入可视块模式,选中需要注释的行
- 1.插入:按shift+i进入编辑模式,输入#,结束按ESC键
- 2.删除:选中内容后,按x或者d键删除
- 3.替换:选中需要替换的内容, 按下r键,然后输入替换后的内容
(2)shift+v 进入可视行模式,选中整行内容
- 1.复制:选中行内容后按y键及可复制。
- 2.删除:选中行内容后按d键删除。
【十四】VIM扩展知识
【1】环境变量临时生效
:set nu #显示行号
:set ic #忽略大小写, 在搜索的时候有用
:set ai #自动缩进
:set list #显示制表符(空行、tab键)
:set no[nu|ic|ai…] #取消临时设定的变量
- 显示行号:
:set nu
- 忽略大小写,在搜索时非常有用:
:set ic
- 自动缩进:
:set ai
- 显示制表符、空行和Tab键:
:set list
- 取消临时设定的环境变量,例如取消行号设置:
:set nonu
【2】环境变量永久生效。
- ~/.vimrc 个人环境变量(优先级高)
- /etc/vimrc 全局环境变量
# vim ~/.vimrc #当下次再打开文件自动显示行号并忽略大小写
set nu
set ic
#如果个人vim环境没有配置, 则使用全局vim环境变量配置。
#如果个人vim环境和全局环境变量产生冲突, 优先使用个人vim环境变量。
【3】如何同时编辑多个文件
vim -o file1 file2 #水平分割
vim -O file1 file2 #垂直分割
#ctrl+ww 文件间切换
在Vim中,你可以使用以下命令来同时编辑多个文件:
- 水平分割打开文件:
vim -o file1 file2
这会将 file1 和 file2 水平分割在不同的窗口中,并同时编辑这两个文件。- 垂直分割打开文件:
vim -O file1 file2
这会将 file1 和 file2 垂直分割在不同的窗口中,并同时编辑这两个文件。在打开多个文件后,你可以使用
ctrl+ww
快捷键在不同的文件之间进行切换。例如,要同时编辑 file1 和 file2,可以在终端中输入以下命令:
【4】相同文件之间差异对比
- 相同文件之间差异对比,通常用于对比修改前后差异
# diff #文件对比
# vimdiff #以vim方式打开两个文件对比,高亮显示不同的内容
文件对比:
diff
- 以 Vim 方式打开两个文件并进行差异对比:
vimdiff
文件对比:
diff
- 可以使用
diff
命令进行文件的对比。- 该命令会显示出两个文件之间的差异,并标识出不同的内容。
以 Vim 方式打开两个文件并进行差异对比:
vimdiff
- 使用
vimdiff
命令可以以 Vim 的方式打开两个文件进行差异对比。- Vimdiff 会高亮显示不同的内容,并方便地进行修改和合并操作。
例如,要对比文件 file1 和 file2 的差异,可以在终端中输入以下命令:
vimdiff file1 file2
【5】非正常退出后处理.swp文件
- 如果在Vim中发生非正常退出(例如使用
ctrl+z
挂起或强制退出终端),可能会留下一个名为.filename.swp
的临时文件,其中filename
是你编辑的文件的名称。 - 为了解决此问题,你可以执行以下命令来删除同名的
.swp
文件:
#假设打开filename文件被以外关闭,需要删除同文件名的.swp文件即可解决
# rm -f .filename.swp
- 通过运行上述命令,你可以删除产生的
.swp
文件,以避免后续的冲突或错误。- 请记住,
.swp
文件通常用于在 Vim 正常退出前自动保存未保存的更改,因此在非正常退出后可以使用.swp
文件来恢复丢失的数据。
【十五】VIM练习示例
【1】练习一
1.将/etc/passwd 复制到/root/目录下,并重命名为test.txt
2.用vim打开test.txt并显示行号
3.分别向下、向右、向左、向右移动5个字符,分别向下、向上翻两页
4.把光标移动到第10行,让光标移动到行末,再移动到行首,移动到test.txt文件的最后一行,移动到文件的首行
5.搜索文件中出现的 root 并数一下一共出现多少个,不区分大小写搜索
6.把从第一行到第三行出现的root 替换成–od–,然后还原上一步操作
8.把整个文件中所有的root替换成–od–
9.把光标移动到20行,删除本行,还原上一步操作
10.删除第19行,还原上一步操作
11.删除从5行到10行的所有内容,还原上一步操作
12.复制2行并粘贴到11行下面,还原上一步操作(按两次u)
13.复制从11行到15行的内容并粘贴到8行上面,还原上一步操作(按两次u)
14.把13行到18行的内容移动文件的尾部,还原上一步操作(按两次u)
15.光标移动到首行,把/sbin/nologin改成/bin/bash
16.在第一行下面插入新的一行,并输入”# Hello!”
17.保存文档并退出
【2】练习示例2
(1)文件
[root@www ~]# cat proxy.conf
server {
Listen 8080;
Server_Name vim.OldboyEDU.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Forward-for;
proxy_intercept_errors on;
proxy_next_upstream error timeout;
proxy_next_upstream_timeout 3s;
proxy_next_upstream_tries 2;
error_page 500 502 403 404 = /proxy_error.html;
}
location = /proxy_error.html {
root /code/proxy;
}
}
(2)题目
1.使用vim打开proxy.conf文件
2.修改Listen为listen小写,并将8080修改为80
3.修改ServerName为server_name小写。
4.修改vim.OldboyEDU.com为vim.oldboy.com
5.在server_name行下插入一行 root /code;
5.复制5-14行的内容,然后将其粘贴到14行下面
6.删除与proxy_set_header相关的两行全部删除
7.如上操作完成后,在13-20行前面加上#号
8.删除21-23的行,然后保存当前文件
【3】解析
(1)练习一
1.将/etc/passwd 复制到/root/目录下,并重命名为test.txt
cp /etc/passwd /root/test.txt
- 在上述命令中,
cp
是用于复制文件的命令,/etc/passwd
是要复制的源文件路径,/root/test.txt
是复制后的目标文件路径。 - 通过执行此命令,
/etc/passwd
文件将被复制到/root/
目录下,并重命名为test.txt
。
2.用vim打开test.txt并显示行号
vim -N /root/test.txt
- 上述命令中,
vim
是打开 Vim 编辑器的命令,-N
参数用于显示行号,/root/test.txt
是要打开的文件路径。 - 通过执行此命令,使用 Vim 打开了
test.txt
文件,并显示了行号。
3.分别向下、向右、向左、向右移动5个字符,分别向下、向上翻两页
使用下列命令和操作实现:
- 向下移动5行:按下
5j
。 - 向右移动5个字符:按下
5l
。 - 向左移动5个字符:按下
5h
。 - 向右移动5个字符:按下
5l
。 - 向下翻两页:按下
2Ctrl + D
。 - 向上翻两页:按下
2Ctrl + U
。
4.把光标移动到第10行,让光标移动到行末,再移动到行首,移动到test.txt文件的最后一行,移动到文件的首行
使用下列命令和操作实现:
- 移动到第10行:按下
10G
或:10
。 - 移动到行末:按下
$
。 - 移动到行首:按下
0
。 - 移动到文件的最后一行:按下
G
或:$
。 - 移动到文件的首行:按下
gg
或:1
。
5.搜索文件中出现的 root 并数一下一共出现多少个,不区分大小写搜索
grep -i -o 'root' /root/test.txt | wc -l
- 上述命令中,
grep
是用于在文件中搜索匹配模式的命令,-i
参数表示不区分大小写,-o
参数表示只输出匹配到的部分,'root'
是要搜索的模式,/root/test.txt
是要搜索的文件路径,wc -l
用于计算匹配到的行数。 - 通过执行此命令,可以搜索文件中出现的 "root" 并输出该单词出现的总次数。
6.把从第一行到第三行出现的root 替换成–od–,然后还原上一步操作
sed -i '1,3 s/root/-od-/' /root/test.txt
-
上述命令中,
sed
是用于进行文本替换的流编辑器,-i
参数表示直接修改源文件,'1,3 s/root/-od-/'
是指在第一行到第三行之间将所有的 "root" 替换为 "-od-",/root/test.txt
是要进行替换的文件路径。通过执行此命令,可以实现替换操作。 -
如果需要还原上一步操作,可以使用 Git 进行版本控制或者使用 Vim 的撤销命令
u
。
8.把整个文件中所有的 root 替换成–od–
sed -i 's/root/-od-/g' /root/test.txt
- 上述命令中,
s/root/-od-/g
指示将文件中所有的 "root" 替换为 "-od-",/root/test.txt
是要进行替换的文件路径。 - 通过执行此命令,文件中的所有 "root" 都会被替换为 "-od-"。
9.把光标移动到20行,删除本行,还原上一步操作
先移动到第20行再删除本行:
- 移动到第20行:按下
20G
或:20
。 - 删除本行:按下
dd
。
要还原上一步操作,可以使用 Vim 的撤销命令 u
。
10.删除第19行,还原上一步操作
sed -i '19d' /root/test.txt
-
上述命令中,
d
是sed
命令的删除操作符,19d
表示删除第19行,/root/test.txt
是要进行删除操作的文件路径。 -
通过执行此命令,可以删除第19行。
-
要还原上一步操作,可以使用 Git 进行版本控制或者使用 Vim 的撤销命令
u
。
11.删除从5行到10行的所有内容,还原上一步操作
sed -i '5,10d' /root/test.txt
- 上述命令中,
5,10d
表示删除从第5行到第10行的所有内容,/root/test.txt
是要进行删除操作的文件路径。 - 通过执行此命令,可以删除指定行数范围内的内容。
- 复制2行并粘贴到11行下面,还原上一步操作(按两次u)
-
命令:yy;p;p
-
解释:yy命令用于复制当前行,p命令用于在当前行的下方粘贴复制的内容。因此,yy;p;p表示将当前行复制两次并粘贴到当前行的下方。
-
案例:
$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
$ vi file.txt
# 光标在第2行
yy;p;p
$ cat file.txt
1. Line 1
2. Line 2
2. Line 2
2. Line 2
3. Line 3
4. Line 4
5. Line 5
还原上一步操作的方法是按两次撤销命令(通常是按下u键),这将撤销上述复制和粘贴操作。
- 复制从11行到15行的内容并粘贴到8行上面,还原上一步操作(按两次u)
-
命令:11,15y;8p
-
解释:11,15y命令用于复制从第11行到第15行的内容,8p命令用于在第8行的上方粘贴复制的内容。因此,11,15y;8p表示将第11行到第15行的内容复制并粘贴到第8行的上方。
-
案例:
$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
$ vi file.txt
# 光标在第1行
11,15y;8p
$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
6. Line 11
7. Line 12
8. Line 13
9. Line 14
10. Line 15
11. Line 2
12. Line 3
13. Line 4
14. Line 5
还原上一步操作的方法是按两次撤销命令(通常是按下u键),这将撤销上述复制和粘贴操作。
- 把13行到18行的内容移动文件的尾部,还原上一步操作(按两次u)
-
命令:13,18m$
-
解释:13,18m$命令用于将第13行到第18行的内容移动到文件的尾部。其中,m表示移动行的命令,$表示文件的尾部。
-
案例:
$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
6. Line 11
7. Line 12
8. Line 13
9. Line 14
10. Line 15
11. Line 2
12. Line 3
13. Line 4
14. Line 5
$ vi file.txt
# 光标在第1行
13,18m$
$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
6. Line 11
7. Line 12
8. Line 2
9. Line 3
10. Line 4
11. Line 5
12. Line 13
13. Line 14
14. Line 15
- 还原上一步操作的方法是按两次撤销命令(通常是按下u键),这将撤销上述移动操作。
- 光标移动到首行,把/sbin/nologin改成/bin/bash
-
命令:gg/\sbin/nologin/s///bin/bash
-
解释:gg命令用于将光标移动到首行,/\sbin/nologin/用于搜索第一个出现的字符串"/sbin/nologin",s命令用于将搜索到的字符串替换为"/bin/bash"。
-
案例:
$ cat file.txt
/sbin/nologin
Line 2
Line 3
$ vi file.txt
# 光标在第1行
gg/\sbin\/nologin/s//\/bin\/bash
$ cat file.txt
/bin/bash
Line 2
Line 3
- 在第一行下面插入新的一行,并输入”# Hello!”
-
命令::2put!="# Hello!"
-
解释::2put!命令用于在当前行的下方插入文本,"# Hello!"表示要插入的文本内容。
-
案例:
$ cat file.txt
Line 1
Line 2
Line 3
$ vi file.txt
# 光标在第1行
:2put!="# Hello!"
$ cat file.txt
Line 1
# Hello!
Line 2
Line 3
- 保存文档并退出
-
命令::wq
-
解释::wq命令用于保存对文档的修改并退出Vi编辑器。
-
案例:
# 光标在文档中,没有命令行提示符
:wq
# 文档已保存并退出Vi编辑器
(2)练习二
- 使用vim打开proxy.conf文件:
vim proxy.conf
- 修改Listen为listen小写,并将8080修改为80:
:%s/Listen/listen/g # 将Listen替换为小写的listen
:%s/8080/80/g # 将8080替换为80
- 修改ServerName为server_name小写,并将vim.OldboyEDU.com修改为vim.oldboy.com:
:%s/Server_Name/server_name/g # 将Server_Name替换为小写的server_name
:%s/vim\.OldboyEDU\.com/vim.oldboy.com/g # 将vim.OldboyEDU.com替换为vim.oldboy.com,注意其中的点需要转义
- 在server_name行下插入一行root /code;:
13a # 在第13行后插入
root /code; # 输入要插入的内容
.
- 复制5-14行的内容,然后将其粘贴到14行下面:
5,14y # 复制5-14行的内容
14p # 在14行下面粘贴复制的内容
- 删除与proxy_set_header相关的两行全部删除:
11,12d # 删除11-12行
- 如上操作完成后,在13-20行前面加上#号:
13,20s/^/# / # 在13-20行前面添加#号注释
- 删除21-23的行,然后保存当前文件:
21,23d # 删除21-23行
:wq # 保存文件并退出vim编辑器
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17647780.html