第4章 文件管理

第4章 文件管理

作业评讲

 1. 创建好虚拟机的快照
 2. 使用windows电脑的命令行ping你安装好的虚拟机
 ping 虚拟机的IP
 ping 192.168.72.128
 ​
 3. 使用不同的账号去远程登录并ping baidu
 ping 192.168.72.1
 ​
 4. 修改你的账号的密码为 123
 1)重启系统,然后快速按 e 键
 2)在最后一行之前输入 rd.break
 3)按 ctrl + x 重启
 4)mount -o remount,rw /sysroot
 5)chroot /sysroot/
 6)echo 123 | passwd --stdin root
 7)touch ./autorelabel
 8)exit
 9)exit
 ​
 5. 修改你的主机名为 rhcsa001 并查看主机名是否修改成功
 1)修改
 hostnamectl hostname rhcsa001
 2)查看
 hostnamectl hostname
 ​
 6. 查看你当前账号的工作目录具体路径
 pwd
 ​
 7. 切换你当前的账号身份为其他账号
 su -l 要切换的账号
 ​
 8. 修改你当前的时区为 Asia/Shanghai
 timedatectl set-time
 ​

在 Linux 中一切皆文件

文件的命名规则

1、不能使用“/”来作为文件名称,因为在 Linux中它代表根目录

2、文件名称不能超过 255 个字符

3、名称区分大小写

注意:在 Linux 中目录也是文件,而在 Linux 中没有扩展名,我们在定义文件时指定扩展名是为了我们自己能看懂。

目录操作相关命令

创建目录

在 linux 中创建目录需要使用 mkdir 命令。命令的格式为:

mkdir [OPTION]... DIRECTORY...

使用示例:

[root@bogon ~]# mkdir /root/dir1
[root@bogon ~]# mkdir dir2
[root@bogon ~]# mkdir dir3/dir4/dir5
mkdir: cannot create directory ‘dir3/dir4/dir5’: No such file or directory
[root@bogon ~]# mkdir -p dir3/dir4/dir5			# 使用 -p 选项可以创建多级目录
[root@bogon ~]# mkdir -v dir4					# 使用 -v 选项可以在创建时显示提示信息
mkdir: created directory 'dir4'

# 可以同时创建多个目录
[root@bogon ~]# mkdir -pv dir11 dir12 dir13     dir14
mkdir: created directory 'dir11'
mkdir: created directory 'dir12'
mkdir: created directory 'dir13'
mkdir: created directory 'dir14'

# 创建多个目录的另一种写法
[root@bogon ~]# mkdir -pv dir{40..45}
mkdir: created directory 'dir40'
mkdir: created directory 'dir41'
mkdir: created directory 'dir42'
mkdir: created directory 'dir43'
mkdir: created directory 'dir44'
mkdir: created directory 'dir45'

# 创建多个目录的再一种方式
[root@bogon ~]# mkdir -pv my{6,8,10}
mkdir: created directory 'my6'
mkdir: created directory 'my8'
mkdir: created directory 'my10'

注意:在大括号中只能写数字

查看目录

查看目录的命令是 ls 或 ll

[root@bogon ~]# ls -al

# -d 选项是显示目录的本身,如果不带 -d 选项则会显示目录的内容
# ? :表示匹配任意一个字符
# * :表示匹配任意多个字符
# [] : 表示匹配中括号中指定的范围的内容
@bogon ~]# ls -d dir?
dir1  dir2  dir3  dir4
[root@bogon ~]# ls -d dir??
dir11  dir12  dir13  dir14  dir40  dir41  dir42  dir43  dir44  dir45
[root@bogon ~]# ls -d dir*
dir1  dir11  dir12  dir13  dir14  dir2  dir3  dir4  dir40  dir41  dir42  dir43  dir44  dir45
[root@bogon ~]# ls -d dir[1-3]
dir1  dir2  dir3

查看空间使用情况

要实现这个功能,我们需要使用 du 命令,它的语法格式为:

du [OPTION]... [FILE]...
# 或者
du [OPTION]... --files0-from=F

选项说明:

  1. -a:统计磁盘空间占用情况

  2. -s:只统计每个文件的空间占用情况

使用示例:

[root@bogon ~]# du
0	./.ssh
0	./.cache/ibus
0	./.cache/evolution/addressbook/trash
0	./.cache/evolution
1976	./.cache/gnome-software/appstream

[root@bogon ~]# du -a
0	./.ssh
4	./.bash_logout
4	./.bash_profile
4	./.bashrc
4	./.cshrc
4	./.tcshrc
4	./anaconda-ks.cfg


[root@bogon ~]# du -s
229260	.

# 统计指定目录大小
[root@bogon ~]# du -s Videos/
0	Videos/

# 统计指定文件大小
[root@bogon ~]# du -s nohup.out 
8	nohup.out

[root@bogon ~]# du -s grafana-enterprise-10.2.0-1.x86_64.rpm
105612	grafana-enterprise-10.2.0-1.x86_64.rpm

[root@bogon ~]# du -hs grafana-enterprise-10.2.0-1.x86_64.rpm
104M	grafana-enterprise-10.2.0-1.x86_64.rpm

删除目录

删除目录要使用 rm 命令,它的语法格式为:

rm [OPTION]... [FILE]...

选项说明:

  1. -f :表示强制删除

  2. -r :表示递归删除,一般在删除目录时需要指定这个选项

  3. -d :表示删除空的目录

  4. -v :表示删除时显示详细的过程

使用示例:

# 当我们删除一个目录时,它会提示不能删除
[root@bogon ~]# rm show{s,
rm: cannot remove 'show{s,': Is a directory

# 使用 -d 选项来删除一个空目录
[root@bogon ~]# rm -d show{s,
rm: remove directory 'show{s,'? y	# 输入 y 来确认删除,如果输入 n 表示不删除

# -f 选项在删除时不会再有确认提示,而是直接删除,所以在使用这个选项时要小心
[root@bogon ~]# rm -df y,			# 注意这里的逗号是文件名称的一部分,不是输入的逗号

# 删除多个空目录,多个目录之间用空格隔开
[root@bogon ~]# rm -fd t} my10

# 删除多个目录的另一种写法
[root@bogon ~]# rm -d dir{11..14}
rm: remove directory 'dir11'? y
rm: remove directory 'dir12'? y
rm: remove directory 'dir13'? y
rm: remove directory 'dir14'? y

# 删除多个目录的再一种写法
[root@bogon ~]# rm -df dir[3-4]
rm: cannot remove 'dir3': Directory not empty
[root@bogon ~]# rm -df dir[1-2]

# 在上面执行删除 dir3 时,报不能删除非空目录的错误,我们来查看这个目录是否为非空目录
[root@bogon ~]# ls dir3
dir4
[root@bogon ~]# tree dir3
dir3
└── dir4
    └── dir5
# 通过上面的命令,我们发现 dir3 这个目录确实不是空目录。对于 rm 这个命令来说,默认只能删除空目录,不能删除非空目录,要想删除非空目录,我们需要带上 -r 选项来进行递归删除。
[root@bogon ~]# rm -rf dir3  # 强制递归删除 dir3 目录及其内容

# 批量删除,使用通配符 * 来表示删除所有能匹配上的目录
[root@bogon ~]# rm -df dir*
[root@bogon ~]# ls
anaconda-ks.cfg                         my8
data                                    node_exporter-1.6.1.linux-amd64.tar.gz
Desktop                                 nohup.out
Documents                               Pictures
Downloads                               prometheus-2.47.2.linux-amd64.tar.gz
grafana-enterprise-10.2.0-1.x86_64.rpm  Public
Music                                   Templates
my6                                     Videos


普通文件管理

创建文件

在 Linux 中创建文件有几种方式,今天我们先使用 touch 命令来创建,它的语法格式为:

touch [OPTION]... FILE...

选项说明:

atime(access time):改变文件的访问时间,通过 -a 选项

mtime(modify time):改变文件的修改时间,通过 -m 选项

ctime(change time):修改文件元数据的时间(所谓元数据就是描述数据的数据。)

查看文件的状态(包括创建时间、修改时间、访问时间),可以使用 stat 命令来实现。例如:

[root@bogon ~]# stat /etc/hostname
  File: /etc/hostname
  Size: 6         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 68737824    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:hostname_etc_t:s0
Access: 2023-11-05 09:59:55.258520443 +0800
Modify: 2023-10-29 16:28:22.813936150 +0800
Change: 2023-10-29 16:28:22.813936150 +0800
 Birth: 2023-10-29 16:28:22.813936150 +0800
 

[root@bogon ~]# hostnamectl hostname openlab
[root@bogon ~]# stat /etc/hostname 
  File: /etc/hostname
  Size: 8         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 68737854    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:hostname_etc_t:s0
Access: 2023-11-05 11:51:11.295500969 +0800
Modify: 2023-11-05 11:51:11.295500969 +0800
Change: 2023-11-05 11:51:11.295500969 +0800
 Birth: 2023-11-05 11:51:11.294500975 +0800
 
 
# 创建一个文件名称为 /root/file1
[root@bogon ~]# touch /root/file1
[root@bogon ~]# ls
anaconda-ks.cfg  file1

# 创建好后,我们使用 stat 命令来查看 file1 这个文件的信息
[root@bogon ~]# stat file1
  File: file1
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 34352616    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-11-05 11:53:24.974711442 +0800
Modify: 2023-11-05 11:53:24.974711442 +0800
Change: 2023-11-05 11:53:24.974711442 +0800
 Birth: 2023-11-05 11:53:24.973711448 +0800

# 当我们再次使用 touch 命令来创建 file1 这个文件时,不会报错。
[root@bogon ~]# touch /root/file1
[root@bogon ~]# stat file1
  File: file1
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 34352616    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-11-05 11:55:11.861080145 +0800
Modify: 2023-11-05 11:55:11.861080145 +0800
Change: 2023-11-05 11:55:11.861080145 +0800
 Birth: 2023-11-05 11:53:24.973711448 +0800

# 注意:如果再执行 touch 命令时,所创建的文件已经存在,则会修改文件的访问时间和修改时间,而它的创建时间不会发生变化。

# 创建多个文件
[root@bogon ~]# touch /root/file{2..5}
[root@bogon ~]# touch /root/file[6-9]
[root@bogon ~]# touch /root/file{11,12}{14,15}
[root@bogon ~]# ls
 anaconda-ks.cfg   file1115  'file[6-9]'                               Pictures
 data              file1214   grafana-enterprise-10.2.0-1.x86_64.rpm   prometheus-2.47.2.linux-amd64.tar.gz
 Desktop           file1215   Music                                    Public
 Documents         file2      my6                                      Templates
 Downloads         file3      my8                                      Videos
 file1             file4      node_exporter-1.6.1.linux-amd64.tar.gz
 file1114          file5      nohup.out

查看文件

浏览文件内容

cat

这个命令的作用是查看文件的所有内容。它的语法格式为:

cat [OPTION]... [FILE]...

选项说明:

-b 作用显示没有空行的行号

-n 显示行号

命令使用示例:

# cat 命令是把一个文件中的内容全部输出,一般使用这个命令来显示小内容的文件。
[root@bogon ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

# -A 选项,会在末尾显示 $ 符号
[root@bogon ~]# cat -A /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$

# -n 选项,为每一行添加行号
[root@bogon ~]# cat -n /etc/passwd
     1	root:x:0:0:root:/root:/bin/bash
     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
head

这个命令用于显示一个文件的前面 10 行数据,它的语法格式为:

head [OPTION]... [FILE]...

选项说明:

-c :输出每行的第一个字符

-n :输出指定的行数,默认为 10 行

使用示例:

# 使用 head 命令来查看文件前 10 行数据
[root@bogon ~]# 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

# 使用 -c 选项来查看指定文件的前面指定的几个字符。注意:如果 -c 后面的数字是负数,那么会从后向前截取。
[root@bogon ~]# head -c 5 /etc/passwd		# 查看前面 5 个字符
root:
[root@bogon ~]# head -c 2 /etc/passwd		# 查看前面 2 个字符
ro

# 使用 -n 选项用于显示指定的行数,默认不指定时是 10 行。注意:如果 -n 选项后面的数字是负数,则会把文件最后指定行去掉后再显示
[root@bogon ~]# head -n 2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
tail

这个命令用于显示文件的最后 10 行数据。它的语法格式为:

tail [OPTION]... [FILE]...

选项说明:

-c :显示指定字符

-n :显示指定行数

-f :显示追加内容

使用示例:

# 显示文件最后 10 行数据
[root@bogon ~]# tail /etc/passwd
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
cockpit-ws:x:983:982:User for cockpit web service:/nonexisting:/sbin/nologin
cockpit-wsinstance:x:982:981:User for cockpit-ws instances:/nonexisting:/sbin/nologin
gnome-initial-setup:x:981:980::/run/gnome-initial-setup/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
chrony:x:980:978:chrony system user:/var/lib/chrony:/sbin/nologin
dnsmasq:x:979:977:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash

# 显示文件最后 3 行数据,这就需要使用 -n 选项
[root@bogon ~]# tail -n 3 /etc/passwd
dnsmasq:x:979:977:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash
# 在 tail 命令中,指定负数的行数无效,它仍然显示最后指定的行数
[root@bogon ~]# tail -n -3 /etc/passwd
dnsmasq:x:979:977:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash
# -n 选项可以省略
[root@bogon ~]# tail -3 /etc/passwd
dnsmasq:x:979:977:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash

# -f 选项,用于获取文件中最新的数据,当使用这个选项后,文件会处于阻塞状态,要退出按 ctrl + C
[root@bogon ~]# tail -f file1

注意:如果指定的行数是正数,则 -n 选项需要带上;如果指定的行数是负数,则 -n 选项可以省略,行数前面的负号就等价于 -n

more(了解)

这个命令用于分页显示文件中的内容。它的语法格式为:

more [options] <file>...

使用示例:

[root@bogon ~]# cp /etc/passwd .
[root@bogon ~]# more passwd
# 空格向下翻页,q 退出

注意:这个命令不能向前翻页。如果希望能够向前翻页,那么我们需要使用 less 命令

less

这个命令的作用也是分页显示文件内容,它的功能与 more 相同。它的语法格式为:

less [options] <file>...

使用示例:

[root@bogon ~]# less passwd

# 我们可以使用按 g 回到第一页,按 G 回到最后一页,按空格向下翻页,按向上向下箭头可以向前翻一行或向后翻一行,q 退出

推荐:使用 less 而不使用 more 来查看大文件的内容,因为 less 功能比 more 强。

过滤文件内容

要实现这个功能,我们需要使用 grep 命令。它的语法格式:

grep [OPTION]... PATTERNS [FILE]...

# 说明:PATTERNS 表示是的要查找的关键字,严格来说应该是要查找的匹配字符

这个命令的功能是在指定的普通文件中查找并显示含有特定字符的行,也可以与管道符一起使用。

选项说明:

-c:仅显示找到的行数

-i:忽略大小写

-n:显示行号

-v:反向选择,它只会列出没有关键字的行

-A:-A 2 搜索时显示匹配到的那一行以及以下 2 行

-B:-B 2 搜索时显示匹配到的那一行以及以上 2 行

-C:-C 2 搜索时显示匹配到的那一行以及以上下 2 行

当PATTERNS是普通字符时
# 1. 需求:在 /etc/passwd 文件中查找含有 root 关键字的所有行
[root@bogon ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# 2. 需求:在 /etc/passwd 文件中查找含有 /sbin/nologin 的所有行
[root@bogon ~]# grep /sbin/nologin /etc/passwd
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

# 3. 需求:在 /etc/passwd 文件中查找不包含有 /sbin/nologin 的所有行
[root@bogon ~]# grep -v /sbin/nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash

# 4. 需求:在 /etc/passwd 文件中查找不包含有 /sbin/nologin 的所有行数
[root@bogon ~]# grep -vc /sbin/nologin /etc/passwd
5

# 5. 需求:在 /etc/passwd 文件中查找包含 libstoragemgmt 行及后面的 3 行内容
[root@bogon ~]# grep -A 3 libstoragemgmt /etc/passwd
libstoragemgmt:x:987:987:daemon account for libstoragemgmt:/:/usr/sbin/nologin
systemd-oom:x:986:986:systemd Userspace OOM Killer:/:/usr/sbin/nologin
pipewire:x:985:984:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
flatpak:x:984:983:User for flatpak system helper:/:/sbin/nologin

# 6. 需求:在 /etc/passwd 文件中查找包含 libstoragemgmt 行及前面的 3 行内容
[root@bogon ~]# grep -B 3 libstoragemgmt /etc/passwd
sssd:x:995:991:User for sssd:/:/sbin/nologin
geoclue:x:994:990:User for geoclue:/var/lib/geoclue:/sbin/nologin
setroubleshoot:x:993:989:SELinux troubleshoot server:/var/lib/setroubleshoot:/sbin/nologin
libstoragemgmt:x:987:987:daemon account for libstoragemgmt:/:/usr/sbin/nologin

# 6. 需求:在 /etc/passwd 文件中查找包含 libstoragemgmt 行及前后的 3 行内容
[root@bogon ~]# grep -C 3 libstoragemgmt /etc/passwd
sssd:x:995:991:User for sssd:/:/sbin/nologin
geoclue:x:994:990:User for geoclue:/var/lib/geoclue:/sbin/nologin
setroubleshoot:x:993:989:SELinux troubleshoot server:/var/lib/setroubleshoot:/sbin/nologin
libstoragemgmt:x:987:987:daemon account for libstoragemgmt:/:/usr/sbin/nologin
systemd-oom:x:986:986:systemd Userspace OOM Killer:/:/usr/sbin/nologin
pipewire:x:985:984:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
flatpak:x:984:983:User for flatpak system helper:/:/sbin/nologin


# 7. 需求:在 /etc/passwd 文件中查找包含 Root 的所有行,不区分大小写
[root@bogon ~]# grep Root /etc/passwd
[root@bogon ~]# grep -i Root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# 8. 需求:在 /etc/passwd 文件中查找包含 Root 的所有行及行号,不区分大小写
[root@bogon ~]# grep -in Root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

注意:-A和-B选项不能同时使用。

当PATTERNS是特殊符号时
匹配模式							说明
grep h 文件名						查找文件里有字符 h 的行
grep ^[q] 文件名					匹配以 q 开头的行
grep ^[qf] 文件名					匹配以 q 或者 f 开头行
grep ^[^qf] 文件名					匹配以 q 或者 f 开头以外的行
grep ^[0-9] 文件名					匹配以数字开头的行
grep h$ 文件名称					匹配以 h 结尾的所有行
grep ^h$ 文件名称					匹配只有 h 的行

使用示例:

# 1. 需求:在 /etc/passwd 文件中查找包含 h 的行
[root@bogon ~]# grep h /etc/passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
clevis:x:996:992:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/usr/sbin/nologin
setroubleshoot:x:993:989:SELinux troubleshoot server:/var/lib/setroubleshoot:/sbin/nologin
flatpak:x:984:983:User for flatpak system helper:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
chrony:x:980:978:chrony system user:/var/lib/chrony:/sbin/nologin
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash

# 2. 需求:在 /etc/passwd 文件中查找以 h 开头的行
[root@bogon ~]# grep ^h /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt

# 3. 需求:在 /etc/passwd 文件中查找以 h 结尾的行
[root@bogon ~]# grep h$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash

# 4. 需求:在 /etc/passwd 文件中查找以 h 开头的以外所有行
[root@bogon ~]# grep ^[^h] /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
.......

# 5. 需求:在 /etc/passwd 文件中查找包含数字的所有行
[root@bogon ~]# grep [0-5] /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

# 6. 需求:在 /etc/ssh/sshd_config 文件中查找以数字结尾的所有行
[root@bogon ~]# grep [0-9]$ /etc/ssh/sshd_config
#Port 22
#ListenAddress 0.0.0.0
#MaxAuthTries 6
#MaxSessions 10
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
#X11DisplayOffset 10
#ClientAliveInterval 0
#ClientAliveCountMax 3
#MaxStartups 10:30:100

文件内容统计

如果希望统计一个文件中的字符个数,我们需要使用 wc 命令。它的语法格式:

wc [OPTION]... [FILE]...
# 或者
wc [OPTION]... --files0-from=F

选项说明:

-c :统计文件大小

-m :统计字符个数

-w :统计单词个数

-l :统计行数

为了便于演示,我们给 file1 文件添加如下的内容:

vim file1

执行这个命令后,按 i 键进行编辑模式,然后输入内容。输入完成后,按 esc 键,然后按 shift + : 来输入冒号,然后输入 wq 保存退出

hello word
redhat
centos

使用 wc 命令:

[root@bogon ~]# wc file1
 3  4 25 file1
 
[root@bogon ~]# wc -lwc file1
 3  4 25 file1

# -c 用于统计文件的大小
[root@bogon ~]# wc -c file1
25 file1

# -m 用于统计字符个数
[root@bogon ~]# wc -m file1
25 file1

# -w 统计文件中单词个数
[root@bogon ~]# wc -w file1
4 file1

# -l 统计文件中行数
[root@bogon ~]# wc -l file1
3 file1

切割显示

切割显示要使用 cut 命令,它的作用是按列提取文本内容。它的语法为:

cut OPTION... [FILE]...

选项说明:

-d :指定分隔符,如果是空格需要使用引号引起来

-f :指定第几个字段

-c :指定获取第几个字符

使用示例:

[root@bogon ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 从上面的显示内容可以发现,passwd 这个文件是通过冒号来进行分割的,一其有七列。

# 1. 需求:查看 /etc/passwd 文件中第1列内容
[root@bogon ~]# cut -d : -f 1 /etc/passwd
root
bin
daemon
adm
# 这个命令解析说明:cut -d 分隔符 -f 要获取的列数 文件

# 2. 需求:查看 /etc/passwd 文件用户家目录所在的列
[root@bogon ~]# head -n 5 /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
# 从上面的显示内容可以发现,用户的家目录在第6列
[root@bogon ~]# cut -d : -f 6 /etc/passwd
/root
/bin
/sbin

# 3. 需求:查看 /etc/passwd 文件第1列到第3列的内容
[root@bogon ~]# cut -d : -f 1-3 /etc/passwd
root:x:0
bin:x:1
daemon:x:2
adm:x:3

# 4. 需求:查看 /etc/passwd 文件中第1列和第3列的内容
[root@bogon ~]# cut -d : -f 1,6 /etc/passwd
root:/root
bin:/bin
daemon:/sbin
adm:/var/adm


# 5. 需求:查看 /etc/passwd 文件中系列的第4个字符
[root@bogon ~]# head -n 2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@bogon ~]# cut -c 4 /etc/passwd
t
:
m
:
x
# 6. 需求:查看 /etc/passwd 文件中系列的第1到第4个字符
[root@bogon ~]# cut -c 1-4 /etc/passwd
root
bin:
daem

排序显示

在 Linux 中可以使用 sort 命令来对文本内容进行排序显示,它的语法为:

sort [OPTION]... [FILE]...
# 或者
sort [OPTION]... --files0-from=F

选项说明:

-b:忽略缩进与空格

-f :忽略大小写

-n :以数值型排序

-r :反向排序

-k :指定字段范围

-t :指定间隔符

-u :去除重复行

使用示例:

# 1. 需求:查看 /etc/passwd 文件第3列并排序
# 原始顺序
[root@bogon ~]# cut -d : -f 3 /etc/passwd
0
1
2
3
4
5
6
7
8
11
12
14
65534
59
999
81
# 自然排序
[root@bogon ~]# cut -d : -f 3 /etc/passwd | sort
0
1
1000
11
12
14
172
2
29
3
32
4
42
# 按数值大小排序
[root@bogon ~]# cut -d : -f 3 /etc/passwd | sort -n
0
1
2
3
4
5
6
7
8
11
12
14
29
# 如果然后按照数值的反向排序
[root@bogon ~]# cut -d : -f 3 /etc/passwd | sort -nr
65534
1000
999
998
997

# 2. 需求:使用 sort 对 /etc/passwd 文件内容进行排序
[root@bogon ~]# sort -nr /etc/passwd
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
systemd-oom:x:986:986:systemd Userspace OOM Killer:/:/usr/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sssd:x:995:991:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
setroubleshoot:x:993:989:SELinux troubleshoot server:/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
pipewire:x:985:984:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
# 从上面的结果可能发现,它是以内容的第一个字符在自然顺序来进行排序的


# 3. 需求:对 /etc/passwd 的第三个字段进行排序
# 命令的解析 sort -t 分隔符 -k 列数 文件
[root@bogon ~]# sort -t : -k 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
redhat:x:1000:1000:redhat:/home/redhat:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin

# 4. 需求:对 /etc/passwd 的第三个字段进行数值排序
[root@bogon ~]# sort -t : -k 3 -n /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

去重显示

使用 uniq 命令可以用于去除文本中连续的重复行,语法格式为:

uniq [OPTION]... [INPUT [OUTPUT]]

选项说明:

-c :可以统计重复行出现的次数

注意:这个命令是去掉文件中重复的内容。只有相邻相同的行才叫重复行,如果是隔开的两个相同行也不算重复。

为了演示这个命令,我们来编辑一个名叫 uniq.txt 的文件,内容如下:

vim uniq.txt

内容如下:

Welcome to openlab.cn
Welcome to openlab.cn
Welcome to openlab.cn
Welcome to openlab.cn
Welcome to openlab.cn
Red Hat certified
Professional guidance
Linux Course

使用示例:

# 文件完整内容
[root@bogon ~]# cat uniq.txt 
Welcome to openlab.cn
Welcome to openlab.cn
Welcome to openlab.cn
Welcome to openlab.cn
Welcome to openlab.cn
Red Hat certified
Professional guidance
Linux Course

# 去掉重复行后的内容
[root@bogon ~]# uniq uniq.txt 
Welcome to openlab.cn
Red Hat certified
Professional guidance
Linux Course

# 使用 -c 选项后会把重复行的数据统计显示
[root@bogon ~]# uniq -c uniq.txt 
      5 Welcome to openlab.cn
      1 Red Hat certified
      1 Professional guidance
      1 Linux Course

面试题

题目:公司有网站日志记录,需要统计出访问该网站访问次数最多的客户端的ip地址是多少。

2022/12/01 12:00 10.0.0.1 Chrome
2022/12/11 12:00 192.168.1.2 Chrome
2022/12/12 12:00 10.0.0.2 Chrome
2023/01/01 13:00 192.168.1.2 firefox
2023/06/06 15:01 10.0.0.2 firefox
2023/07/01 14:00 10.0.0.2 IE
2023/08/01 13:00 192.168.1.2 firefox

实现:

1)创建一个名为 weblog.txt 文件,内容如上所示

[root@bogon ~]# vim weblog.txt
[root@bogon ~]# cat weblog.txt
2022/12/01 12:00 10.0.0.1 Chrome
2022/12/11 12:00 192.168.1.2 Chrome
2022/12/12 12:00 10.0.0.2 Chrome
2023/01/01 13:00 192.168.1.2 firefox
2023/06/06 15:01 10.0.0.2 firefox
2023/07/01 14:00 10.0.0.2 IE
2023/08/01 13:00 192.168.1.2 firefox

2)获取 weblog.txt 文件的第三列的 IP 地址信息

[root@bogon ~]# cut -d ' ' -f 3 weblog.txt
10.0.0.1
192.168.1.2
10.0.0.2
192.168.1.2
10.0.0.2
10.0.0.2
192.168.1.2

3)对第二步执行的结果进行排序

[root@bogon ~]# cut -d ' ' -f 3 weblog.txt | sort
10.0.0.1
10.0.0.2
10.0.0.2
10.0.0.2
192.168.1.2
192.168.1.2
192.168.1.2

4)对第三步执行的结果进行去重

[root@bogon ~]# cut -d ' ' -f 3 weblog.txt | sort | uniq -c
      1 10.0.0.1
      3 10.0.0.2
      3 192.168.1.2

5)再对第四步执行的结果进行排序(对结果的第一列进行排序,并且是按数值反向排序)

[root@bogon ~]# cut -d ' ' -f 3 weblog.txt | sort | uniq -c | sort -t ' ' -k 1 -nr
      3 192.168.1.2
      3 10.0.0.2
      1 10.0.0.1

6)最后从第五步执行的结果中获取第一行数据就是我们的最多的访问记录

[root@bogon ~]# cut -d ' ' -f 3 weblog.txt | sort | uniq -c | sort -t ' ' -k 1 -nr | head -n 1
      3 192.168.1.2

课后作业

真实案例:公司网站日志文件(/root/access.log)如下:

2021/01/01 01:01 192.168.168.1 ie
2021/01/02 01:02 192.168.168.2 chrome
2021/01/03 01:03 192.168.168.1 ie
2021/01/04 12:00 192.168.168.1 ie
2021/01/05 01:05 192.168.168.3 firefox
2021/01/06 01:06 192.168.168.4 chrome
2021/01/06 01:06 192.168.168.6 chrome
2021/01/06 01:06 192.168.168.6 chrome
2021/01/07 12:07 192.168.168.5 ie
2021/01/06 01:06 192.168.168.6 chrome

领导要求:查出访问我们公司网站次数排名前三的客户端ip地址,并且还要知道访问的次数。

实现:

[root@bogon ~]# cut -d ' ' -f 3 access.log | sort | uniq -c
      3 192.168.168.1
      1 192.168.168.2
      1 192.168.168.3
      1 192.168.168.4
      1 192.168.168.5
      3 192.168.168.6
[root@bogon ~]# cut -d ' ' -f 3 access.log | sort | uniq -c | sort -t ' ' -k 1
      1 192.168.168.2
      1 192.168.168.3
      1 192.168.168.4
      1 192.168.168.5
      3 192.168.168.1
      3 192.168.168.6
[root@bogon ~]# cut -d ' ' -f 3 access.log | sort | uniq -c | sort -t ' ' -k 1 -r
      3 192.168.168.6
      3 192.168.168.1
      1 192.168.168.5
      1 192.168.168.4
      1 192.168.168.3
      1 192.168.168.2
[root@bogon ~]# cut -d ' ' -f 3 access.log | sort | uniq -c | sort -t ' ' -k 1 -r | head -n 3
      3 192.168.168.6
      3 192.168.168.1
      1 192.168.168.5

编辑文件

数据流

对于数据流来说,可以分为标准输入、标准输出和标准错误输出。

  • 标准输入:standard input,简称 stdin,默认情况下,标准输入是指从键盘获取到的输入内容,它的代码为 0。

  • 标准输出:standard output,简称 stdout,默认情况下,标准输出是指命令执行后把正确的信息输出在屏幕上,它的代码为 1。

  • 标准错误输出:standard error output,简称 stderr,默认情况下,标准错误输出是指命令执行失败后,将错误信息输出到屏幕上,它的代码为 2。

重定向

重定向也通常称为重定向操作符,在 Linux 中,重定向操作符有以下几种:

  • 输出重定向操作符:>>>

  • 输入重定向操作符:<<<

对输出重定向操作符中 >>> 的区别是:

[root@bogon ~]# echo 123456 > b.txt
[root@bogon ~]# ls
a.txt  b.txt
[root@bogon ~]# cat b.txt
123456
[root@bogon ~]# echo abc > b.txt
[root@bogon ~]# cat b.txt
abc
[root@bogon ~]# echo hello >> b.txt
[root@bogon ~]# cat b.txt
abc
hello

从上面演示的代码可以得到:> 是以覆盖的形式来添加内容,而 >> 是以追加的形式来添加内容。

严格来说应该是这样:将左边命令执行的结果输出到右边的文件中。

对于标准输出的使用示例:

[root@bogon ~]# echo 'word' > c.txt
[root@bogon ~]# cat < c.txt
word
[root@bogon ~]# cat c.txt
word

[root@bogon ~]# cat > d.txt << end
> hello
> end
[root@bogon ~]# cat d.txt
hello
[root@bogon ~]# cat > d.txt << end
> world
> redhat
> openlab
> chenke
> end
[root@bogon ~]# cat d.txt
world
redhat
openlab
chenke

从上面的演示代码中可以得到:< 是以覆盖的形式来写入内容,而 << 是以追加的形式来写入内容。

echo

echo 命令是用于在终端设备上输出字符串或者变量取值后的值。它的语法:echo 字符串 或者 echo $变量名称

[root@bogon ~]# echo 123
123
[root@bogon ~]# echo hello
hello
[root@bogon ~]# echo a1
a1
[root@bogon ~]# echo $PWD
/root
[root@bogon ~]# pwd
/root
[root@bogon ~]# echo $pwd

[root@bogon ~]# echo $SHELL
/bin/bash
[root@bogon ~]# echo $PS1
[\u@\h \W]\$


PS1 常用的参数含义介绍:
\d :表示日期,格式为 weekday month date,如:Sun 11 12
\t : 表示时间,格式为 HH:MM:SS,24进制表示
\T : 表示时间,格式为 HH:MM:SS,12进制表示
\H :表示完整的主机名称
\h : 表示取主机名称的第一个名字
\u : 表示当前用户的账号名称
\w :表示完成的工作目录名称		如:/home/redhat/aa/bb
\W : 表示基本的工作目录,即它只会列出最后一个目录  如:bb
\# : 表示下达的是第几个命令
\$ : 表示提示符,如果是超级用户,提示符为 #,否则为 $

vi编辑器

什么是vi编辑器

在 windows 中我们有记事本,word 等可视化的文本编辑工具可以使用,但在 Linux 中给我们内置的就只有 vi 编辑器,它的作用就类似于 windows 中的记事本。

在前面我们使用过 vim ,它和 vi 有什么关系?

vim 是 vi 的增强版,它支持关键字变色。(通过演示,发现在 9 版本中 vi 和 vim 的区别不大)

vim 最早发布于 1991 年,它的英文全称为 vi mproved。

vim编辑器的使用格式

它的语法格式为:

vim [arguments] [file ..]       edit specified file(s)
   or:
vim [arguments] -               read text from stdin
   or: 
vim [arguments] -t tag          edit file where tag is defined
   or: 
vim [arguments] -q [errorfile]  edit file with first error
vim编辑器的三种模式

在vim编辑中有三模式,它们分别是:

  • 命令模式:它是默认的模式,当执行 vim 命令后就会进入到这个模式。

    • 光标移动:可以按上下左右箭头来移动光标 *

    • gg :将光标移动到文件的开头,10gg ,它表示将光标移动到前面第10行 *

    • shift + g :将光标移动到文件的末尾 *

    • ^ :将光标移动到行首

    • $ : 将光标移动到行尾

    • w : 将光标向后移动一个单词的距离,前面可以带数字

    • b : 将光标向前移动一个单词的距离,前面可以带数字

    • yy : 表示复制一行数据,前面可以带数据表示复制多少行 *

    • p : 将复制的数据粘贴到光标所在位置之后 *

    • P : 将复制的数据粘贴到光标所在位置之前

    • u : 用于撤销之前的一步操作 *

    • dd : 用于删除光标所在行,可以带数字,表示删除多少行 *

    • dG : 删除从当前光标所在位置到最后

    • dgg : 删除从当前光标所在位置到开头

  • 插入模式:要进入这个模式,我们需要按 iaso 或 IASO,按 esc 键回到命令模式。

    • i :在光标之前插入 *

    • a : 在光标之后插入

    • I : 在行首的非空白字符前插入

    • A : 在行首的非空白字符后插入

    • o : 在光标所在行的下一行插入 *

    • O : 在光标所在行的上一行插入

    • s : 删除插入

    • S :删除行插入

  • 末行模式:这个模式是用于保存退出的或查找,在命令模式下输入 : 进入末行模式。

    • :wq 保存退出,它的快捷方式为 shift + zz *

    • :w 只保存不退出,如果希望另存为指定文件,则可以使用 :w 要路径的路径和文件,如: :w /root/passwd1

    • :q 只退出不保存

    • :q! 强制退出 *

    • :wq! 强制保存并退出

    • :r 用于将指定的文件写入到当前文件的光标所在位置,例如 :r /root/hello.txt *

    • /keyword 用于执行关键字搜索,执行后按 n 向后搜索,按 N 向前搜索 *

    • :%s/被替换的关键字/替换的内容/gi 用于替换文件中的内容,g 表示全局替换,i 表示不区分大小写 * 扩展:可以只替换某几行 :起始行号,结束行号s/被替换字符/替换内容/gi

    • :set nu 用于显示行号 *

    • :set nonu 用于关闭行号 *

    • :noh 用于取消高亮 *

[root@bogon ~]# rm -f *
[root@bogon ~]# ls
[root@bogon ~]# pwd
/root
[root@bogon ~]# cat /etc/passwd > passwd
[root@bogon ~]# vim passwd



[root@bogon ~]# echo hello world > hello.txt
[root@bogon ~]# ls
hello.txt  passwd  passwd1
[root@bogon ~]# cat hello.txt
hello world
[root@bogon ~]# vim passwd

删除文件

删除文件的命令也是 rm 命令。

[root@bogon ~]# ls
hello.txt  passwd  passwd1
[root@bogon ~]# rm -f passw* *.txt world{1,4}
[root@bogon ~]# ls

链接文件管理

在 Linux 中链接文件分为两种:

  • 软链接文件

  • 硬链接文件

软链接文件

软链接文件也叫符号链接文件,它和原文件一样也是一种文件,它与 Windows 中的快捷方式功能一样。如果原文件删除,那么所创建(指向)的软链接文件也会被破坏了。每个软链接文件都有自己的 node ,node 是 Linux 中特殊文件的一种,作为一个文件,它的数据是它所在链接文件的路径。软链接可以跨越文件系统,也可以为目录建立。

创建软链接的语法为:

ln [OPTION]... [-T] TARGET LINK_NAME
# 或者
ln [OPTION]... TARGET
# 或者
ln [OPTION]... TARGET... DIRECTORY
# 或者
ln [OPTION]... -t DIRECTORY TARGET...

在这个命令中,常用的选项为 -s。

简单来说它的语法格式为:

ln -s 原文件 目标文件/链接名称

使用示例:

# 将 /etc/passwd 文件复制到 /root/目录下
[root@bogon ~]# cat /etc/passwd > passwd
[root@bogon ~]# ls
passwd
[root@bogon ~]# ll
total 4
-rw-r--r--. 1 root root 2224 Nov 12 17:06 passwd

# 为 /root/passwd 文件创建软链接文件,文件的名称为 passwdlink
[root@bogon ~]# ln -s /root/passwd passwdlink

# 查询软链接文件
[root@bogon ~]# ll
total 4
-rw-r--r--. 1 root root 2224 Nov 12 17:06 passwd
lrwxrwxrwx. 1 root root   12 Nov 12 17:07 passwdlink -> /root/passwd

# 显示软链接文件对应的文件的内容
[root@bogon ~]# head -n 5 passwdlink 
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


# 删除原文件
[root@bogon ~]# rm -f passwd

# 查看链接文件已经无效
[root@bogon ~]# ll
total 0
lrwxrwxrwx. 1 root root 12 Nov 12 17:07 passwdlink -> /root/passwd

# 当原文件被删除后,软链接文件不能再使用了
[root@bogon ~]# head -3 passwdlink 
head: cannot open 'passwdlink' for reading: No such file or directory

硬链接文件

硬链接文件是相当把原文件重新复制一份,它有自己的 inode,当移除原文件后,硬链接文件还可以使用。

创建硬链接文件的语法格式为:

ln  原文件   目录文件/链接名称

使用示例:

# 删除前面创建的软链接文件
[root@bogon ~]# rm -f passwdlink
[root@bogon ~]# ls

# 复制 /etc/passwd 文件到当前目录下
[root@bogon ~]# cat /etc/passwd > passwd
[root@bogon ~]# ls
passwd

# 给 /root/passwd 文件创建软链接文件,文件的名称为 passwd.lnk
[root@bogon ~]# ln -s /root/passwd passwd.lnk
[root@bogon ~]# ls -l
total 4
-rw-r--r--. 1 root root 2224 Nov 12 17:18 passwd
lrwxrwxrwx. 1 root root   12 Nov 12 17:19 passwd.lnk -> /root/passwd

# 给 /root/passwd 文件创建硬链接文件,文件名称为 passwd.hard
[root@bogon ~]# ln /root/passwd passwd.hard
[root@bogon ~]# ls -l
total 8
-rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd
-rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd.hard
lrwxrwxrwx. 1 root root   12 Nov 12 17:19 passwd.lnk -> /root/passwd


# 创建一个空白的 1.txt 文件
[root@bogon ~]# touch 1.txt

# 以长列表的方式来查看这个文件,并显示它的 inode 值
[root@bogon ~]# ls -il
total 8
34762517 -rw-r--r--. 1 root root    0 Nov 12 17:25 1.txt

# 创建软链接文件
[root@bogon ~]# ln -s /root/1.txt 2.txt

# 查看软链接文件的 inode 值
[root@bogon ~]# ls -il
total 8
34762517 -rw-r--r--. 1 root root    0 Nov 12 17:25 1.txt
34762518 lrwxrwxrwx. 1 root root   11 Nov 12 17:25 2.txt -> /root/1.txt

# 创建硬链接文件
[root@bogon ~]# ln /root/1.txt 3.txt

# 查看硬链接的 inode 值
[root@bogon ~]# ls -il
total 8
34762517 -rw-r--r--. 2 root root    0 Nov 12 17:25 1.txt
34762518 lrwxrwxrwx. 1 root root   11 Nov 12 17:25 2.txt -> /root/1.txt
34762517 -rw-r--r--. 2 root root    0 Nov 12 17:25 3.txt


# 删除硬链接文件
[root@bogon ~]# rm -f 3.txt

# 查看删除后的结果
[root@bogon ~]# ls -il
total 8
34762517 -rw-r--r--. 1 root root    0 Nov 12 17:25 1.txt
34762518 lrwxrwxrwx. 1 root root   11 Nov 12 17:30 2.txt -> /root/1.txt

# 重新创建硬链接
[root@bogon ~]# ln /root/1.txt 3.txt
# 再次查看文件信息
[root@bogon ~]# ls -il
total 8
34762517 -rw-r--r--. 2 root root    0 Nov 12 17:25 1.txt
34762518 lrwxrwxrwx. 1 root root   11 Nov 12 17:30 2.txt -> /root/1.txt
34762517 -rw-r--r--. 2 root root    0 Nov 12 17:25 3.txt

# 删除原文件
[root@bogon ~]# rm -f 1.txt
# 查看删除后的结果
[root@bogon ~]# ls -il
total 8
34762518 lrwxrwxrwx. 1 root root   11 Nov 12 17:30 2.txt -> /root/1.txt
34762517 -rw-r--r--. 1 root root    0 Nov 12 17:25 3.txt
# 查看软链接文件内容
[root@bogon ~]# cat 2.txt
cat: 2.txt: No such file or directory
# 查看硬链接文件内容
[root@bogon ~]# cat 3.txt

删除链接文件

删除链接文件的语法和删除文件的语法一致。

# 删除硬链接文件
[root@bogon ~]# rm -f 3.txt

# 删除软链接文件
[root@bogon ~]# rm -f 2.txt

软链接和硬链接的区别

1、软链接以路径的形式存在,而硬链接是以副本的方式存在,但不占用实际空间(inode 相同)。

2、软链接可以跨文件系统,而硬链接不可以。

3、软链接可以对一个不存在的文件进行创建,而硬链接只能对同一个文件系统中存在的文件进行创建。

[root@bogon ~]# ls -l
total 8
lrwxrwxrwx. 1 root root   11 Nov 12 17:30 2.txt -> /root/1.txt
-rw-r--r--. 1 root root    0 Nov 12 17:25 3.txt
lrwxrwxrwx. 1 root root   11 Nov 12 17:40 6.txt -> /root/5.txt
-rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd
-rw-r--r--. 2 root root 2224 Nov 12 17:18 passwd.hard
lrwxrwxrwx. 1 root root   12 Nov 12 17:19 passwd.lnk -> /root/passwd
[root@bogon ~]# ln /root/7.txt 8.txt
ln: failed to access '/root/7.txt': No such file or directory

4、软链接可以对目录进行链接,而硬链接不允许。

复制移动文件

复制文件

复制文件使用 cp 命令,它的语法格式为:

cp [OPTION]... 源路径  目标路径

选项说明:

  • -a :在拷贝文件的同时保留链接、文件属性

  • -d :拷贝时保留链接

  • -f :在覆盖已经存在的目标路径时不提示

  • -r :递归拷贝

使用示例:

# 将 3.txt 文件复制到当前目录下,并重命令为 33.txt 
[root@bogon ~]# cp 3.txt 33.txt
[root@bogon ~]# ls
2.txt  33.txt  3.txt  6.txt  passwd  passwd.hard  passwd.lnk

[root@bogon ~]# mkdir dir1
[root@bogon ~]# ls
2.txt  33.txt  3.txt  6.txt  dir1  passwd  passwd.hard  passwd.lnk

# 将 3.txt 文件复制到当前目录下的 dir1 目录下,并重命令为 5.txt
[root@bogon ~]# cp 3.txt dir1/5.txt
[root@bogon ~]# ls dir1
5.txt

[root@bogon ~]# mkdir dir2

# 复制文件但不重命名
[root@bogon ~]# cp 3.txt dir2/
[root@bogon ~]# ls dir2/
3.txt

# 带选项的复制
[root@bogon ~]# cp -a passwd passwd.bak

移动文件或目录

移动文件我们使用 mv 命令,它的语法为:

mv [OPTION]... [-T] SOURCE DEST
# 或者
mv [OPTION]... SOURCE... DIRECTORY

使用示例:

# 删除当前目录下所有文件
[root@bogon ~]# rm -rf *

[root@bogon ~]# ls

# 在当前目录下创建 1.txt 文件
[root@bogon ~]# touch 1.txt
[root@bogon ~]# ls
1.txt

# 在当前上当下创建 d1 目录
[root@bogon ~]# mkdir d1

# 查看当前目录下所有内容
[root@bogon ~]# ls
1.txt  d1

# 将当前目录下的 1.txt 文件剪切到 d1 目录下
[root@bogon ~]# mv 1.txt d1/
[root@bogon ~]# ls
d1
[root@bogon ~]# ls d1/
1.txt

# 在当前目录下创建 d2 目录
[root@bogon ~]# mkdir d2
[root@bogon ~]# ls
d1  d2

# 将当前目录下的 d1 目录剪切到 d2 目录下
[root@bogon ~]# mv d1 d2/
[root@bogon ~]# ls
d2
[root@bogon ~]# ls d2
d1

# 在当前上当下新建 2.txt 文件
[root@bogon ~]# touch 2.txt

# 以树形结构显示当前目录下所有文件
[root@bogon ~]# tree
.
├── 2.txt
└── d2
    └── d1
        └── 1.txt

2 directories, 2 files

# 将当前目录下的 2.txt 文件剪切到 d2 目录下并重命名为 22.txt
[root@bogon ~]# mv 2.txt d2/22.txt
[root@bogon ~]# tree
.
└── d2
    ├── 22.txt
    └── d1
        └── 1.txt

2 directories, 2 files

压缩和解压缩

在Linux 中,压缩文件的命令有以下几种:

  • zip,它对应的解压命令为 unzip

  • gzip,它对应的解压命令为gunzip

  • bzip2,它对应的解压命令为bunzip2

zip和unzip

zip

zip: 可以压缩文件和目录

语法:zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]

压缩:zip 压缩后的文件名称 要压缩的文件及路径

解压:unzip 压缩文件 要解压的路径

示例:

# 将当前目录下的所有文件压缩为 my.zip 文件
[root@localhost ~]# zip my.zip ./*
  adding: 1.txt (stored 0%)
  adding: 2.txt (stored 0%)
  adding: 3.txt (stored 0%)
  adding: a.txt (stored 0%)
  adding: b.txt (stored 0%)
  adding: file1 (stored 0%)
  adding: file2 (stored 0%)
  adding: file3 (stored 0%)
  adding: install.h (stored 0%)
  adding: install.log (deflated 46%)
[root@localhost ~]# ls
1.txt  2.txt  3.txt  a.txt  b.txt  file1  file2  file3  install.h  install.log  my.zip

# 指定最高的压缩率
[root@localhost ~]# zip -9 txt.zip 1.txt 2.txt
  adding: 1.txt (stored 0%)
  adding: 2.txt (stored 0%)

# 准备工作
[root@localhost ~]# mkdir hello/world
[root@localhost ~]# echo hello > hello/a.txt
[root@localhost ~]# echo world > hello/world/b.txt
[root@localhost ~]# tree hello
hello
├── a.txt
└── world
    └── b.txt
    
# 使用 -r 选项来递归压缩hello目录下的所有文件内容到 hello.zip 文件中
[root@localhost ~]# zip -r hello.zip hello/
  adding: hello/ (stored 0%)
  adding: hello/world/ (stored 0%)
  adding: hello/world/b.txt (stored 0%)
  adding: hello/a.txt (stored 0%)
[root@localhost ~]# zip hello1.zip hello/
  adding: hello/ (stored 0%)
  
# 注意:如果要想把指定目录下的所有内容压缩到文件中,必须带上 -r 选项。否则只会把目录名称压缩到文件中,而内容没有。

# 如果希望把某些文件再次添加到已经存在的压缩文件中,则需要使用 -m 选项来完成。例如:将 1.txt 和 2.txt 添加到 hello.zip 压缩文件中。
[root@localhost ~]# zip -m hello.zip 1.txt 2.txt
  adding: 1.txt (stored 0%)
  adding: 2.txt (stored 0%)


# 如果希望把压缩文件中某些文件删除,则可以使用 -d 选项。例如:将 hello.zip 文件中的 2.txt 文件从压缩文件中删除
[root@localhost ~]# zip -d hello.zip 2.txt
deleting: 2.txt


# 如果希望在压缩指定目录下所有文件时,又需要排除一些文件,则可以使用 -x 选项来完成,它的语法:zip xx.zip 在压缩的文件 -x 要排除的文件
# 例如:将 root 下的所有文件压缩为 root.zip,但排除 3.txt 文件。
[root@localhost ~]# ls
3.txt  a.txt  b.txt  hello  hello.zip
[root@localhost ~]# zip root.zip ./* -x 3.txt
  adding: a.txt (stored 0%)
  adding: b.txt (stored 0%)
  adding: hello/ (stored 0%)
  adding: hello.zip (stored 0%)

unzip

unzip 的作用就是将 zip 压缩的文件进行解压。

语法:unzip [选项] 压缩文件 解压路径

示例:

# 创建目录a
[root@localhost ~]# mkdir a
# 进入到目录a
[root@localhost ~]# cd a
# 将 hello.zip 文件复制到 a 目录下
[root@localhost a]# cp ../hello.zip .
# 查看a目录下的内容
[root@localhost a]# ls
hello.zip
# 将 a 目录下的 hello.zip 文件解压到当前目录
[root@localhost a]# unzip hello.zip 
Archive:  hello.zip
   creating: hello/
   creating: hello/world/
 extracting: hello/world/b.txt       
 extracting: hello/a.txt             
 extracting: 1.txt  
# 查看 a 目录下的内容
[root@localhost a]# ls
1.txt  hello  hello.zip

# 如果希望将压缩文件内容解压到指定目录下,则可以使用 -d 选项来指定目录。例如:将hello.zip 文件的内容解压到 b 目录下。
# 1. 回到上级目录,即 /root 目录下
[root@localhost a]# cd ..
# 2. 在 /root 目录下新建 b 目录
[root@localhost ~]# mkdir b
# 3. 将 hello.zip 文件解压到 b 目录下,注意:需要在命令中带上 -d 选项来指定目录
[root@localhost ~]# unzip hello.zip -d b/
Archive:  hello.zip
   creating: b/hello/
   creating: b/hello/world/
 extracting: b/hello/world/b.txt     
 extracting: b/hello/a.txt           
 extracting: b/1.txt


# 如果我们只是希望查看压缩文件中的内容,而不想解压文件,则可以使用 -v 选项。例如:查看 root.zip 文件的内容
[root@localhost ~]# unzip -v root.zip 
Archive:  root.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
      25  Stored       25   0% 11-19-2023 14:55 db167373  a.txt
      25  Stored       25   0% 11-19-2023 14:55 db167373  b.txt
       0  Stored        0   0% 11-19-2023 15:49 00000000  hello/
     801  Stored      801   0% 11-19-2023 16:02 966e1d03  hello.zip
--------          -------  ---                            -------
     851              851   0%                            4 files

gzip和gunzip命令

这两个命令的作用与 zip和unzip的作用相同,只是压缩文件的格式不一样。

语法:gzip [OPTION]... [FILE]...

# gzip 用于压缩文件

[root@localhost ~]# ls
3.txt  a  b  hello  hello.zip  root.zip
[root@localhost ~]# gzip 3.txt
[root@localhost ~]# ls
3.txt.gz  a  b  hello  hello.zip  root.zip
# 注意:使用 gzip 压缩文件后,源文件会被删除

# 如果希望在使用 gzip 压缩文件时,保留源文件,则需要使用 -c 选项。
# 1. 在 /root 目录下新建 1.txt 文件
[root@localhost ~]# touch 1.txt
# 2. 查看 /root 目录下的内容
[root@localhost ~]# ls
1.txt  3.txt.gz  a  b  hello  hello.zip  root.zip
# 3. 对 1.txt 文件进行 gzip 压缩并保留源文件
[root@localhost ~]# gzip -c 1.txt > 1.txt.gz
# 4. 查看 /root 目录下所有内容
[root@localhost ~]# ls
1.txt  1.txt.gz  3.txt.gz  a  b  hello  hello.zip  root.zip



# gunzip 用于解压文件

# 将 3.txt.gz 文件解压到当前目录下,解压成功后,压缩文件会被删除
[root@localhost ~]# gunzip 3.txt.gz 
[root@localhost ~]# ls
1.txt  1.txt.gz  3.txt  a  b  hello  hello.zip  root.zip

# 将 1.txt.gz 文件解压到指定的目录中,需要使用 -d 选项
[root@localhost ~]# gunzip 1.txt.gz -d b/
gzip: 1.txt already exists; do you wish to overwrite (y or n)? y
gzip: b/ is a directory -- ignored
[root@localhost ~]# ls b
1.txt  hello

bzip2、bunzip2命令

是更新的Linux压缩工具,比gzip有着更高的压缩率。

[root@localhost ~]# bzip2 3.txt
[root@localhost ~]# ls
1.txt.bz2  3.txt.bz2  a  b  hello  hello.zip  root.zi

# 压缩
[root@localhost ~]# touch 1.txt
[root@localhost ~]# touch 2.txt
[root@localhost ~]# bzip2 *.txt
bzip2: Output file 1.txt.bz2 already exists.
[root@localhost ~]# ls
1.txt  1.txt.bz2  2.txt.bz2  3.txt.bz2  a  b  hello  hello.zip  root.zip
[root@localhost ~]# touch 2.txt
[root@localhost ~]# rm -f 1.txt.bz2
[root@localhost ~]# rm -f *.txt.bz2
[root@localhost ~]# ls
1.txt  2.txt  a  b  hello  hello.zip  root.zip
[root@localhost ~]# bzip2 *.txt
[root@localhost ~]# ls
1.txt.bz2  2.txt.bz2

# 解压
[root@localhost ~]# bunzip2 1.txt.bz2 
[root@localhost ~]# ls
1.txt  2.txt.bz2

tar规档文件

语法:tar [OPTION...] [FILE]...

示例:

# tar 命令的入门
# 1. 文件准备
[root@localhost ~]# touch 1.txt 2.txt 3.txt
[root@localhost ~]# ls
1.txt  2.txt  3.txt
# 2. 压缩文件,将以 .txt 结尾的文件压缩到 txt.tar 文件中
[root@localhost ~]# tar -cf txt.tar *.txt
[root@localhost ~]# ls
1.txt  2.txt  3.txt  txt.tar
# 3. 查看压缩文件中的内容
[root@localhost ~]# tar -tvf txt.tar
-rw-r--r-- root/root         0 2023-11-19 17:08 1.txt
-rw-r--r-- root/root         0 2023-11-19 17:08 2.txt
-rw-r--r-- root/root         0 2023-11-19 17:08 3.txt
# 4. 解压文件,将 txt.tar 压缩文件解压到当前目录下。
[root@localhost ~]# tar -xf txt.tar

# 选项说明:
# -c :等价于 --create 选项,作用是创建一个新的的规档文件(压缩文件)
# -t : 等价于 --list 选项,作用是以列表有方式显示规档文件(压缩文件)中的内容,一般会有 -v 选项结合使用
# -v : 等价于 --verbose 选项,作用是显示
# -x : 等价于 --extract, --get 选项,作用是解压文件
# -f : 等价于 --file=ARCHIVE 选项,作用是指定规档文件(压缩文件),此选项必须放到所有选择的最后,它后面必须紧跟文件名称
# -z : 等价于 --gzip, --gunzip, --ungzip 选项,作用是将 zip 文件压缩/解压为规档文件
# -C : 等价于 --directory=DIR 选项,作用是将压缩文件解压到指定的目录下

# 例如:将 /etc/passwd 文件压缩到当前目录下,文件名称为 passwd.tar
[root@localhost ~]# tar -cvf passwd.tar /etc/passwd
tar: Removing leading `/' from member names
/etc/passwd
[root@localhost ~]# tar -cvf tab.tar /etc/passwd /etc/crontab 
tar: Removing leading `/' from member names
/etc/passwd
tar: Removing leading `/' from hard link targets
/etc/crontab
[root@localhost ~]# ls
1.txt      2.txt      3.txt      passwd.tar  txt.tar
1.txt.bak  2.txt.bak  3.txt.bak  tab.tar

# 查看
[root@localhost ~]# tar -tvf tab.tar
-rw-r--r-- root/root      2224 2023-10-15 19:52 etc/passwd
-rw-r--r-- root/root       451 2022-03-23 18:19 etc/crontab

# 解压
[root@localhost ~]# tar -xvf tab.tar
etc/passwd
etc/crontab

# 解压到指定的目录下
[root@localhost ~]# mkdir tab
[root@localhost ~]# ls
1.txt      2.txt      3.txt      etc         tab      txt.tar
1.txt.bak  2.txt.bak  3.txt.bak  passwd.tar  tab.tar
[root@localhost ~]# ls tab
[root@localhost ~]# tar -xvf tab.tar -C tab/
etc/passwd
etc/crontab
[root@localhost ~]# ls tab/
etc

# 将 /etc/passwd 文件压缩为 tar.gz 文件,在命令的选项中指定 -z 选项,来表示要使用 zip 压缩文件
[root@localhost ~]# tar -czvf passwd.tar.gz /etc/passwd
tar: Removing leading `/' from member names
/etc/passwd
[root@localhost ~]# ls
1.txt  1.txt.bak  2.txt  2.txt.bak  3.txt  3.txt.bak  etc  passwd.tar  passwd.tar.gz  tab  tab.tar  txt.tar


# 解压缩 .tar.gz 的文件
[root@localhost ~]# tar -zxvf passwd.tar.gz
etc/passwd

别名命令

别名是命令的快捷方式。对于需要经常执行,并需要很长时间输入的长命令创建快捷方式很有用。

语法:alias [-p] [name[=value] ... ] alias 别名=’原命令 [选项]…… [参数]……’

这个命令可以显示别名,也可以指定别名:

# 显示别名
[root@localhost bin]# alias ll
alias ll='ls -l --color=auto'
# 上面的示例表示 ll 命令就是 ls -l 这个命令的别名。


# 定义别名,我们重新把 ll 这个命令定义别名如下:
[root@localhost bin]# alias ll='ls -l'

[root@localhost bin]# openlab
bash: openlab: command not found...
[root@localhost bin]# alias openlab='ls'
[root@localhost bin]# openlab
appletviewer  jar        javadoc         javapackager  jconsole  jhat   jps         jstat         orbd        rmid         servertool  wsimport
ControlPanel  jarsigner  javafxpackager  java-rmi.cgi  jcontrol  jinfo  jrunscript  jstatd        pack200     rmiregistry  tnameserv   xjc
extcheck      java       javah           javaws        jdb       jjs    jsadebugd   keytool       policytool  schemagen    unpack200
idlj          javac      javap           jcmd          jdeps     jmap   jstack      native2ascii  rmic        serialver    wsgen
[root@localhost bin]# alias build='mkdir -p'
[root@localhost bin]# build a/b/c/d/e
[root@localhost bin]# tree
.
├── a
│   └── b
│       └── c
│           └── d
│               └── e

命令历史

history命令可以查阅命令历史记录 ,也可在命令行利用向上或向下光标键来进行查询。

语法:history [选项] [参数]

选项: number:显示最近number条命令历史 -c:清空当前历史命令 -a [file]:后面没跟文件时,默认将缓冲区中历史命令写入~/.bash_history中 -r [file]:将历史命令文件中的命令读入当前历史命令缓冲区中 -w:将当前历史命令缓冲区命令写入历史命令文件中;

[root@localhost ~]# history 
    1  ip a
    2  init 6
    
[root@node13 ~]# !1   将1871条命令再执行一遍
ip a
[root@node13 ~]# !!     执行上一条命令
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

璀云霄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值