第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
选项说明:
-a:统计磁盘空间占用情况
-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]...
选项说明:
-f :表示强制删除
-r :表示递归删除,一般在删除目录时需要指定这个选项
-d :表示删除空的目录
-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 ~]# !! 执行上一条命令