- A+
一、计算机基础和Linux基础知识
1.冯诺依曼体系结构
1946年美籍匈牙利数学家冯·诺依曼于提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。冯·诺依曼体系的要点是:
- 数字计算机的数制采用二进制,bit位, byte字节1 byte = 8 bit
- 计算机应该按照程序顺序执行
- 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成
8个二进制位bit(b)称为一个字节byte(B)
(1)二级制和十进制转换
0 2^0 1 2^1 10 2 2^2 100 4 2^3 1000 8 2^4 10000 16 2^5 100000 32 2^6 1000000 64 2^7 10000000 128 2^8 256 2^9 512 2^10 1024 #综上,0的个数等于2的次方数
例:十进制26的二进制计算方法
26=16+8+2 10000 16 01000 8 00010 2 11010 #方法:用2的n次方的数去凑成所要求的二进制数,奇数+1
(2)ibase和obase用法
ibase:设置输入数据的进制
obase:设置输出数据的进制
[root@rocky01 ~]#bc bc 1.07.1 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. obase=2 ibase=10 26 11010
不同进制转换:
八进制转十进制: echo "obase=10; ibase=8; 377" lbc
二进制转十进制: echo "obase=10; ibase=2; 11111111" |bc
二进制转16进制: echo "obase=16; ibase=2; 11111111" |bc
[root@rocky01 ~]#echo "obase=10; ibase=8; 377" |bc 255 [root@rocky01 ~]#echo "obase=10; ibase=2; 11111111" |bc 255 [root@rocky01 ~]#echo "obase=16; ibase=2; 11111111" |bc FF
2.摩尔定律
由英特尔(Intel)创始人之一戈登·摩尔于1965年提出,当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍
3.Linux/Unix 哲学思想、原则、理念
- 一切都是一个文件(包括硬件)
- 小型,单一用途的程序
- 链接程序,共同完成复杂的任务(shell脚本)
- 避免令人困惑的用户界面
- 配置数据存储在文本中
4.开源许可证 GPL、BSD、MIT、Mozilla、Apache和LGPL
(1)区别
(2)查看软件的发行许可(License)
[root@rocky01 ~]#rpm -qi kernel |grep License License : GPLv2 and Redistributable, no modification permitted [root@rocky01 ~]# [root@rocky01 ~]#rpm -qi openssh|grep License License : BSD
5.安装Centos8、Rocky8和Ubuntu20.4
(1)Centos8、Rocky8
(1.1)在启动安装时按Tab键在命令后面添加" net.ifnames=0 biosdevname=0 "可以将网卡名称限定为eth开头
(1.2)系统默认语言选择:English
(1.3)时区:Asia/Shanghai
(1.4)安装方式:Minimal Install (建议选择最小安装,遇到错误去解决后能积累经验)
(1.5)分区:暂时默认
(1.6)网络和主机名
(1.7)设置root用户和密码
(1.8)创建普通用户
(1.9)重启安装完成
(2)Ubuntu
(2.1)系统默认语言选择:English
(2.2)安装或升级:选择Continue without updating 安装不更新
(2.3)键盘语言布局:默认English
(2.4)网络配置:开启了DHCP会自动分配一个IP地址
(2.5)代理配置:默认
(2.6)镜像地址:http://mirrors.aliyun.com/ubuntu/ 使用阿里云的镜像地址,在国内速度快些
(2.7)分区:暂时默认
(2.8)创建普通用户
(2.9)Enable Ubuntu Advantage:默认
(2.10)开启SSH
(2.11)Featured Server Snps:默认
(2.12)安装完成后重启
6.什么是Shell
Shell 是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
#各种Shell [root@rocky01 ~]#echo ${SHELL} /bin/bash [root@rocky01 ~]#cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
7.shell中可执行的两类(内外)命令
- 内部命令:由shell自带的,而且通过某命令形式提供, ,用户登录后自动加载并常驻内存中
- 外部命令:在文件系统路径下有对应的可执行程序文件,当执行命令时才从磁盘加载至内存中,执行完毕后从内存中删除
查看是内部还是外部命令
type COMMAND
[root@rocky01 ~]# type -a echo echo is a shell builtin #内部命令 echo is /usr/bin/echo #外部命令 #综上,echo既是内部命令又是外部命令 [root@rocky01 ~]# type -a who who is /usr/bin/who #外部命令
hash缓存表
系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率
命令常见用法
- hash 显示hash缓存
- hash -l 显示hash缓存,可作为输入使用
- hash -p path name 将命令全路径path起别名为name
- hash -t name 打印缓存中name的路径
- hash -d name 清除name缓存
- hash -r 清除缓存
8.文件系统目录结构
(1)结构
文件和目录被组织成一个单根倒置树结构
文件系统从根目录下开始,用“/”表示
根文件系统(rootfs):root filesystem
标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
以 . 开头的文件为隐藏文件
路径分隔的 /
文件名最长255个字节
包括路径在内文件名称最长4095个字节
蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件
除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
(2)常用目录功能
- /bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
- /sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
- /boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
- /dev:设备文件及特殊文件存储位置
- /etc:配置文件目录
- /home:普通用户家目录
- /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
- /lib64:专用于x86_64系统上的辅助共享库文件存放位置
- /media:便携式移动设备挂载点
- /mnt:临时文件系统挂载点
- /opt:第三方应用程序的安装位置
- /proc:用于输出内核与进程信息相关的虚拟文件系统
- /sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
- /root:管理员的家目录
- /run:目前在系统中运行的一些临时文件
- /srv:系统上运行的服务用到的数据
- /tmp:临时文件存储位置
- /usr: universal shared, read-only data
├── bin: 保证系统拥有完整功能而提供的应用程序
├── sbin:
├── lib:32位使用
├── lib64:只存在64位系统
├── include: C程序的头文件(header files)
├── share:结构化独立的数据,例如doc, man等
├── local:第三方应用程序的安装位置- /var:variable data files
├── cache: 应用程序缓存数据目录
├── lib: 应用程序状态信息数据
├── local:专用于为/usr/local下的应用程序存储可变数据
├── lock: 锁文件
├── log: 日志目录及文件
├── opt: 专用于为/opt下的应用程序存储可变数据
├── run: 运行中的进程相关数据,通常用于存储进程pid文件
├── spool: 应用程序数据池
├── tmp: 保存系统两次重启之间产生的临时数据
9.Linux下的文件类型
- - 普通文件
- d 目录文件directory
- l 符号链接文件link
- b 块设备block
- c 字符设备character
- p 管道文件pipe
- s 套接字文件socket
10.文件元数据和节点表结构
(1)inode 表结构
每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息
每一个inode表记录对应的保存了以下信息:
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
指针
磁盘是一种块文件,以块的方式来存储数据,每块通常都是4K,
- 直接指针
直接指针直接指向存放的位置,直接指针只有12个,12x4K=48K,可以表达48K的数据一个文件假如是1K或者哪怕是一个字节,也要分配一块4k的空间来存储这个文件,一个文件假如是10k,分配3块空间来存放,就有3个指针来指向存放的3个块- 间接指针
指针不是直接指向数据存储的位置,而是指向指针块,指针块也是4K大小,一个指针放4个字节,一个指针块可以放1024个指针,4Kx1024=4M ,可以表达4M的数据超过48K低于4M,就可以用间接指针来表示- 双重间接指针一个间接指针块指向另一个间接指针块矩阵4Kx1024x1024=4G,可以表达4G的数据
- 三重间接指针
4Kx1024x1024x1024=4T,可以表达4T的数据
(2)硬链接
硬链接本质上就给一个文件起一个新的名称,实质是同一个文件
硬链接特性
- 创建硬链接会在对应的目录中增加额外的记录项以引用文件
- 对应于同一文件系统上一个物理文件
- 每个目录引用相同的inode号
- 创建时链接数递增
- 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
- 不能跨越驱动器或分区
- 不支持对目录创建硬链接
格式
ln filename [linkname ]
(3)软链接或符号链接
一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件
软链接特点
- 一个符号链接的内容是它引用文件的名称
- 可以对目录创建软链接
- 可以跨分区的文件实现
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
- 在创建软链接时, 如果源文件使用相对路径,是相对于软链接文件的路径,而非相对于当前工作目录,但是软链接的路径如果是相对路径,则是相对于当前工作目录
格式
ln -s filename [linkname]
(4)硬链接和软链接的区别
硬链接 | 软链接 | |
本质 | 本质是同一个文件 | 本质不是同一个文件 |
跨设备 | 不支持 | 支持 |
inode(节点) | 相同 | 不同 |
链接数 | 创建新的硬链接,链接数增加;删除硬链接,链接数减少 | 创建或删除,链接数不会变化 |
文件夹 | 不支持 | 支持 |
相对路径 | 原始文件相对路径是相对于当前工作目录 | 原始文件的相对路径是相对于链接文件的相对路径 |
删除源文件 | 只是链接数减一,但链接文件的访问不受影响 | 链接文件将无法访问 |
文件类型 | 和源文件相同 | 链接文件,和源文件无关 |
文件大小 | 和源文件相同 | 源文件的路径长度 |
ls -i 打印每个文件的索引号
索引号inode相同的本质上是同一个文件(前提是同一个逻辑卷)
[root@rocky01 ~]# echo abc > f1.txt [root@rocky01 ~]# [root@rocky01 ~]# ln f1.txt f2.txt [root@rocky01 ~]# ln -s f1.txt f3.txt [root@rocky01 ~]# [root@rocky01 ~]# ls -li total 8 201327634 -rw-r--r--. 2 root root 4 Jul 27 15:28 f1.txt 201327634 -rw-r--r--. 2 root root 4 Jul 27 15:28 f2.txt 201327862 lrwxrwxrwx. 1 root root 6 Jul 27 15:28 f3.txt -> f1.txt
11.用户、组和权限
(1)用户
Linux中每个用户是通过 User Id (UID)来唯一标识的
- 管理员:root, 0
- 普通用户:1-60000 自动分配
- 系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后)
- 对守护进程获取资源进行权限分配
- 登录用户:500+ (CentOS6以前), 1000+(CentOS7以后)
- 给用户进行交互式登录使用
(2)用户组
Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的。
- 管理员组:root, 0
- 普通组:
- 系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
- 普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用
(3)用户和组的关系
- 用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组
- 用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附属组
例:
[root@rocky01 ~]# id postfix uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
12.磁盘分区
(1)为什么要分区
- 优化I/O性能
- 实现磁盘空间配额限制
- 提高修复速度
- 隔离系统和程序
- 安装多个OS
- 采用不同文件系统
(2)分区方式
两种分区方式:MBR,GPT
(2.1)MBR分区
使用32位表示扇区数,分区不超过2T
MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
MBR分区:主和扩展分区对应的1--4,/dev/sda3,逻辑分区从5开始,/dev/sda5
(2.2)GPT分区
支持128个分区,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)
13.文件系统
Linux 常用文件系统
- ext2:Extended fifile system 适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分区
- ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复
- ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
- xfs:SGI,支持最大8EB的文件系统
- swap
- iso9660 光盘
- btrfs(Oracle)
14.RAID
(1)什么是RAID
"RAID"一词是由David Patterson, Garth A. Gibson, Randy Katz 于1987年在加州大学伯克利分校发明的。在1988年6月SIGMOD会议上提交的论文"A Case for Redundant Arrays of Inexpensive Disks”"中提出,当时性能最好的大型机不断增长的个人电脑市场开发的一系列廉价驱动器的性能所击败。尽管故障与驱动器数量的比例会上升,但通过配置冗余,阵列的可靠性可能远远超过任何大型单个驱动器的可靠性
独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列 (Redundant Array of Inexpensive Disks),简称磁盘阵列。利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。
RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如:RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。
简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个实体硬盘。RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合。由于硬盘价格的不断下降与RAID功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要大容量存储空间的工作,如:视频与音频制作
(1)RAID-0
条带卷 2+ (最低磁盘个数) 空间利用率100% 读写速度快,不容错
(2)RAID-1
镜像卷 2 50% 读写速度一般,容错
(3)RAID5
带奇偶校验的条带卷 3+ (n-1)/n 读写速度块,容错,允许坏一块盘
(4)RAID6
带奇偶校验的条带集,双校验 4+ (n-2)/n 读写快,容错,允许坏两块
(5)RAID10
RAID1的安全+RAID0的高速 4 50% 读写速度快,容错
(6)实现软RAID
mdadm工具:为软RAID提供管理界面,为空余磁盘添加冗余,结合内核中的md(multi devices)
RAID设备可命名为/dev/md0、/dev/md1、/dev/md2、/dev/md3等
常用选项说明:
- 模式:
- 创建:-C
- 装配:-A
- 监控:-F
- 管理:-f, -r, -a
- <raiddevice>: /dev/md#
- <component-devices>: 任意块设备
- -C: 创建模式
- -n #: 使用#个块设备来创建此RAID
- -l #:指明要创建的RAID的级别
- -a {yes|no}:自动创建目标RAID设备的设备文件
- -c CHUNK_SIZE: 指明块大小,单位k
- -x #: 指明空闲盘的个数
- -D:显示raid的详细信息
- mdadm -D /dev/md#
- 管理模式:
- -f: 标记指定磁盘为损坏
- -a: 添加磁盘
- -r: 移除磁盘
- 观察md的状态: cat /proc/mdstat
范例
#使用mdadm创建并定义RAID设备 [root@rocky01 ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}1 #用文件系统对每个RAID设备进行格式化 [root@rocky01 ~]# mkfs.xfs /dev/md0 #使用mdadm检查RAID设备的状况 [root@rocky01 ~]# mdadm --detail|D /dev/md0 #增加新的成员 [root@rocky01 ~]# mdadm -G /dev/md0 -n4 -a /dev/sdf1 #模拟磁盘故障 [root@rocky01 ~]# mdadm /dev/md0 -f /dev/sda1 #移除磁盘 [root@rocky01 ~]# mdadm /dev/md0 -r /dev/sda1 #在备用驱动器上重建分区 [root@rocky01 ~]# mdadm /dev/md0 -a /dev/sda1 #系统日志信息 [root@rocky01 ~]# cat /proc/mdstat
二、Linux基础命令
1.apt
命令 | 功能 |
apt remove | 会删除软件包而保留软件的配置文件 |
apt purge | 会同时清除软件包和软件的配置文件 |
2.查看当前终端设备
VMware同时按Ctrl+Alt+F12345... 可切换新的终端设备
(1)tty
#远程终端查看 [root@rocky01 ~]#tty /dev/pts/0 #VMware上查看 [root@rocky01 ~]#tty /dev/tty1
(2)who
root@ubuntu01:~# who rye tty1 2022-07-12 11:58 root pts/0 2022-07-12 13:19 (10.0.0.1)
3.设置主机名
注:主机名不支持使用下划线,但支持横线,可使用字母,横线或数字组合
#临时生效 [root@rocky01 ~]#hostname NAME #持久生效,支持CentOS7以上和Ubuntu18.04以上版本 [root@rocky01 ~]#hostnamectl set-hostname NAME
4.命令提示符 prompt (PS1)
PS1="[e[1;33m][u@h W]\$ [e[0m]"
提示符格式说明
- e 或 33 控制符
- u 当前用户
- h 主机名简称
- H 主机名
- w 当前工作目录
- W 当前工作目录基名
- t 24小时时间格式
- T 12小时时间格式
- ! 命令历史数
- # 开机后命令历史数
范例:
[root@rocky01 ~]# PS1="[e[1;33m][t-u@h W!-#]\$ [e[0m]" [00:45:34-root@rocky01 ~243-25]# 注: 243 !命令历史数 25 #开机后命令历史数
5.别名alias
定义别名NAME,其相当于执行命令VALUE
alias NAME='VALUE'
#显示当前shell进程所有可用的命令别名 [root@rocky01 ~]# alias alias cdnet='cd /etc/sysconfig/network-scripts' alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias xzegrep='xzegrep --color=auto' alias xzfgrep='xzfgrep --color=auto' alias xzgrep='xzgrep --color=auto' alias zegrep='zegrep --color=auto' alias zfgrep='zfgrep --color=auto' alias zgrep='zgrep --color=auto'
创建别名 alias NAME='VALUE'
[root@rocky01 ~]# alias cdnet='cd /etc/sysconfig/network-scripts' [root@rocky01 ~]# cdnet [root@rocky01 network-scripts]# pwd /etc/sysconfig/network-scripts
撤销别名 unalias NAME
[root@rocky01 ~]# unalias ls #撤销单个别名 [root@rocky01 ~]# unalias -a #撤销所有别名
如果要执行原命令,可使用
ALIASNAME
"ALIASNAME"
'ALIASNAME'
[root@rocky01 ~]# cp 1 /opt/ cp: overwrite '/opt/1'? y [root@rocky01 ~]# cp 1 /opt/ [root@rocky01 ~]# 'cp' 1 /opt/ [root@rocky01 ~]# "cp" 1 /opt/
6.查看硬件信息
(1)查看CPU
[root@rocky01 ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 2 On-line CPU(s) list: 0,1 ... [root@rocky01 ~]# cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 23 model : 96 model name : AMD Ryzen 5 4600H with Radeon Graphics ...
(2)查看内存
[root@rocky01 ~]# free -h total used free shared buff/cache available Mem: 1.7Gi 275Mi 873Mi 8.0Mi 636Mi 1.3Gi Swap: 2.0Gi 40Mi 2.0Gi [root@rocky01 ~]# cat /proc/meminfo MemTotal: 1828236 kB MemFree: 894484 kB MemAvailable: 1350024 kB Buffers: 4800 kB Cached: 505376 kB ...
(3)查看硬盘和分区情况
[root@rocky01 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 199G 0 part ├─rl-root 253:0 0 70G 0 lvm / ├─rl-swap 253:1 0 2G 0 lvm [SWAP] └─rl-home 253:2 0 127G 0 lvm /home sr0 11:0 1 1024M 0 rom [root@rocky01 ~]# cat /proc/partitions major minor #blocks name 8 0 209715200 sda 8 1 1048576 sda1 8 2 208665600 sda2 11 0 1048575 sr0 253 0 73400320 dm-0 253 1 2125824 dm-1 253 2 133136384 dm-2
(4)查看系统架构
[root@rocky01 ~]# arch x86_64
(5)查看内核版本
[root@rocky01 ~]# uname -r 4.18.0-372.9.1.el8.x86_64
(6)查看操作系统发行版本
Centos8、Rocky8
[root@rocky01 ~]# cat /etc/os-release NAME="Rocky Linux" VERSION="8.6 (Green Obsidian)" ID="rocky" ID_LIKE="rhel centos fedora" VERSION_ID="8.6" PLATFORM_ID="platform:el8" PRETTY_NAME="Rocky Linux 8.6 (Green Obsidian)" ANSI_COLOR="0;32" CPE_NAME="cpe:/o:rocky:rocky:8:GA" HOME_URL="https://rockylinux.org/" BUG_REPORT_URL="https://bugs.rockylinux.org/" ROCKY_SUPPORT_PRODUCT="Rocky Linux" ROCKY_SUPPORT_PRODUCT_VERSION="8" REDHAT_SUPPORT_PRODUCT="Rocky Linux" REDHAT_SUPPORT_PRODUCT_VERSION="8"
Ubuntu
[root@ubuntu2004 ~]#cat /etc/os-release NAME="Ubuntu" VERSION="20.04.4 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.4 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=focal UBUNTU_CODENAME=focal [root@ubuntu2004 ~]#cat /etc/issue Ubuntu 20.04.4 LTS n l
7.日期和时间
date
[root@rocky01 ~]# date +"%F %T " 2022-07-12 14:11:02 [root@rocky01 ~]# echo `date +"%F %T "` 2022-07-12 14:11:13
cal
[root@rocky01 ~]# cal July 2022 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
修改时区
[root@ubuntu2004 ~]# timedatectl set-timezone Asia/Shanghai
8.欢迎信息提示issue、motd文件
/etc/issuc 登录之前显示
/etc/motd 登录之后显示
9.echo基本用法
常用选项:
- -E (默认)不支持 解释功能
- -n 不自动换行
- -e 启用 字符的解释功能
启用命令选项-e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
- a 发出警告声
- b 退格键
- c 最后不加上换行符号
- e escape,相当于 33
显示颜色:
" 33[字符背景颜色;字体颜色m字符串 33[0m"
"e[字符背景颜色;字体颜色m字符串e[0m"
显示变量:
[root@rocky01 ~]# a=1 [root@rocky01 ~]# echo "$a" #用变量值替换,弱引用 1 [root@rocky01 ~]# echo '$a' #变量不会替换,强引用 $a
10.命令行扩展和被括起来的集合
(1)" " 、' ' 、` ` 三者区别
[root@rocky01 ~]# echo "echo $HOSTNAME" echo rocky01 [root@rocky01 ~]# echo 'echo $HOSTNAME' echo $HOSTNAME [root@rocky01 ~]# echo `echo $HOSTNAME` rocky01
#结论:
单引号:强引用,六亲不认,变量和命令都不识别,都当成了普通的字符串;'最傻'
双引号:弱引用,不能识别命令,可以识别变量;"半傻不精"
反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容当成命令进行执行后,再交给调用反向单引号的命令继续;`最聪明`
(2)括号扩展:{ }
{ } 可以实现打印重复字符串的简化形式
[root@rocky01 ~]# echo {1..3} 1 2 3 [root@rocky01 ~]# echo {a..c} a b c [root@rocky01 ~]# echo file{1..3}{a..c} file1a file1b file1c file2a file2b file2c file3a file3b file3c
11.history命令行历史
常用选项:
- -c 清空命令历史
- -d offset 删除历史中指定的第offset个命令
- n 显示最近的n条历史(例:histtory 10)
显示时间和用户:
[root@rocky01 ~]# HISTTIMEFORMAT="%F %T `whoami` " [root@rocky01 ~]# history |tail -n 3 363 2022-07-27 02:29:18 root HISTTIMEFORMAT="%F %T `whoami` " 364 2022-07-27 02:29:20 root history 365 2022-07-27 02:29:49 root history |tail -n 3
12.调用命令行历史
- !! 、Ctrl+P 重复上一个命令
- !n 执行history命令输出对应序号n的命令
- !$ 表示前一个命令中最后一个参数
[root@rocky01 ~]# cat /etc/motd I am motd! [root@rocky01 ~]# !! cat /etc/motd I am motd! [root@rocky01 ~]# history |tail -n 2 375 2022-07-27 02:33:14 root cat /etc/motd 376 2022-07-27 02:33:43 root history |tail -n 2 [root@rocky01 ~]# [root@rocky01 ~]# !375 cat /etc/motd I am motd! [root@rocky01 ~]# ll !$ ll /etc/motd -rw-r--r--. 1 root root 11 Jul 27 01:58 /etc/motd
13.bash的快捷键
- Ctrl + l 清屏,相当于clear命令
- Ctrl + o 执行当前命令,并重新显示本命令
- Ctrl + s 阻止屏幕输出,锁定
- Ctrl + q 允许屏幕输出,解锁
- Ctrl + c 终止命令
- Ctrl + z 挂起命令
- Ctrl + a 光标移到命令行首,相当于Home
- Ctrl + e 光标移到命令行尾,相当于End
- Ctrl + d 删除光标处的一个字符
- Ctrl + u 从光标处删除至命令行首
- Ctrl + k 从光标处删除至命令行尾
14.whatis显示命令的简短描述
此工具在系统刚安装后,不可立即使用,需要制作数据库后才可使用
man -f 等同于 whatis
#CentOS 7 版本以后 [root@rocky01 ~]# mandbmandb #CentOS 6 版本之前 [root@centos6 ~]# mandbmakewhatis
[root@rocky01 ~]# whatis passwd openssl-passwd (1ssl) - compute password hashes passwd (1) - update user's authentication tokens passwd (5) - password file [root@rocky01 ~]# man -f passwd openssl-passwd (1ssl) - compute password hashes passwd (1) - update user's authentication tokens passwd (5) - password file
15.man提供命令帮助的文件
man 帮助段落说明
序号 名称 含义 1 NAME 名称及简要说明 2 SYNOPSIS 用法格式说明 3 DESCRIPTION 详细说明 4 AUTHOR 作者 5 REPORTING BUGS 报告的错误信息 6 COPYRIGHT 版本信息 7 SEE ALSO 其它帮助参考
- < > 必选内容
- [ ] 可选内容
- ... 同一内容可出现多次
- { } 分组
16.pwd显示当前工作目录
每个shell和系统进程都有一个当前的工作目录
- -P 显示真实物理路径
- -L 显示链接路径(默认)
[root@rocky01 ~]# ll /sbin lrwxrwxrwx. 1 root root 8 Oct 11 2021 /sbin -> usr/sbin [root@rocky01 ~]# cd /sbin [root@rocky01 sbin]# pwd -P /usr/sbin [root@rocky01 sbin]# pwd /sbin
17.绝对和相对路径
绝对路径:以正斜杠/ 即根目录开始、完整的文件的位置路径、可用于任何想指定一个文件名的时候
相对路径:不以斜线开始,一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置,可以作为一个简短的形式指定一个文件名
(1)basename
基名,只取文件名,不要路径
[root@rocky01 sbin]# basename /etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-eth0
(2)dirname
目录名,只取路径,不要文件名
[root@rocky01 sbin]# dirname /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts
18.ls列出目录内容
常用选项:
- -a 包含隐藏文件
- -l 显示额外的信息
- -R 目录递归
- -ld 目录和符号链接信息
- -i 打印每个文件的索引号
- -1 文件分行显示
- -S 按从大到小排序
- -t 按mtime排序
- -u 配合-t选项,显示并按atime从新到旧排序
- -U 按目录存放顺序显示
- -X 按文件后缀排序
- -F 对不同类型文件显示时附加不同的符号:*/=>@|
- -C 文件多时,以多列的方式显示文件,默认是一列(标准输出)
说明
ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和变量$LS_COLORS定义
ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小
19.stat 查看文件状态
每个文件有三个时间戳:
- Access time 访问时间,atime,读取文件内容
- Modify time 修改时间,mtime,改变文件内容(数据)
- Change time 改变时间,ctime,元数据发生改变
[root@rocky01 ~]#stat /etc/passwd File: /etc/passwd Size: 2504 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 134924395 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:passwd_file_t:s0 Access: 2022-07-19 18:12:04.427008996 +0800 Modify: 2022-07-12 07:39:20.510971037 +0800 Change: 2022-07-12 07:39:20.511971037 +0800 Birth: 2022-07-12 07:39:20.510971037 +0800
20.file检查文件的类型
[root@rocky01 ~]#file linux.txt linux.txt: ASCII text [root@rocky01 ~]#file win.txt win.txt: ASCII text, with CRLF line terminators
修改文件类型:vim打开目标文件
:set ff=unix :set ff=dos
21.常见通配符
* |
匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件 |
? |
匹配任何单个字符,一个汉字也算一个字符 |
[0-9] |
匹配数字范围 |
[a-z] |
一个字母 |
[peng] |
匹配列表中的任何的一个字符 |
[^peng] |
匹配列表中的所有字符以外的字符 |
[:digit:] |
任意数字,相当于0-9 |
[:lower:] |
任意小写字母,表示 a-z |
[:upper:] |
任意大写字母,表示 A-Z |
范例: [ ] 和 { }
[root@rocky01 ~]# touch f{1..3} [root@rocky01 ~]# ls f1 f2 f3 [root@rocky01 ~]# [root@rocky01 ~]# ls f{1..5} ls: cannot access 'f4': No such file or directory ls: cannot access 'f5': No such file or directory f1 f2 f3 [root@rocky01 ~]# [root@rocky01 ~]# ls f[1-5] f1 f2 f3
22.touch创建空文件和刷新时间
选项说明
- -a 仅改变 atime和ctime
- -m 仅改变 mtime和ctime
- -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
- -c 如果文件不存在,则不予创建
23.cp复制文件和目录
常用选项
- -i 如果目标已存在,覆盖前提示是否覆盖
- -n 不覆盖
- -r,-R 递归复制目录及内部的所有内容
- -b 目标存在,覆盖前先备份,默认形式为filename~,只保留最近一次的备份
- -a 存档,常用于备份功能
- -v 详细
范例:
将/etc/目录下所有文件,备份到/data独立的子目录下,并要求子目录格式为 backupYYYY-mm-dd,备份过程可见,要求保留原有权限
[root@rocky01 ~]# cp -av /etc/ /data/backup`date +%F` '/etc/' -> '/data/backup2022-07-27' '/etc/dnf' -> '/data/backup2022-07-27/dnf' '/etc/dnf/dnf.conf' -> '/data/backup2022-07-27/dnf/dnf.conf' ...省略...
24.mv移动和重命名文件
常用选项
- -i 交互式
- -f 强制
- -b 目标存在,覆盖前先备份
- -t (mv -t dir file 表示将file移动到dir)
25.rm删除文件
常用选项:
- -i 交互式
- -f 强制删除
- -r 递归
- --no-preserve-root 删除/
26.目录操作
(1)tree 显示目录数
常见选项:
- -d: 只显示目录
- -L level:指定显示的层级数目
- -P pattern: 只显示由指定wild-card pattern匹配到的路径
(2)mkdir 创建目录
常见选项:
- -p: 存在于不报错,且可自动创建所需的各目录
- -v: 显示详细信息
- -m MODE: 创建目录时直接指定权限
(3)rmdir 删除空目录
常见选项:
- -p 递归删除父空目录
- -v 显示详细信息
注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树
27.IO重定向
Linux给程序提供三种 I/O 设备
文件描述符 | 设备文件名 | 设备描述 |
0 | stdin | 标准输入 |
1 | stdout | 标准输出 |
2 | stderr | 标准错误输出 |
操作符号 | 描述 |
1> 或 > | 把STDOUT重定向到文件 |
2> | 把STDERR重定向到文件 |
&> | 把标准输出和错误都重定向 |
>> | 追加标准输出重定向至文件 |
2>> | 追加标准错误重定向至文件 |
范例:
(1)清除大文件
[root@rocky01 data]# cat /dev/null > /data/big.log
(2)将标准输出和错误都重定向到同一个文件
方法一: [root@rocky01 ~]# ls /data /xxx > /data/all.log 2>&1 方法二: [root@rocky01 ~]# ls /data /xxx 2> /data/all.log 1>&2 方法三: [root@rocky01 ~]# ls /data/ /xxx &> /data/all.log [root@rocky01 ~]# cat /data/all.log ls: cannot access '/xxx': No such file or directory /data/: all.log test.txt
28.高级重定向
(1)cmd <<< "string"
# cmd <<< 'string' 将string的内容作为cmd的输入 (注:只能字符串)
[root@rocky01 ~]# bc <<<`seq -s+ 10` 55
(2)cmd1 < <(cmd2)
cmd1 < <(cmd2) 将cmd2的输出作为cmd1的输入(输入会写入一个临时文件,中间通过临时文件传递) 作用等同于 "cmd2 | cmd1"
[root@rocky01 ~]# bc < <(seq -s+ 10) 55 #查看是否会生成临时文件 [root@rocky01 ~]# ll <(seq -s+ 10) lr-x------. 1 root root 64 Jul 14 19:55 /dev/fd/63 -> 'pipe:[300474]'
29.tr 转换和删除字符
常用选项:
- -d 删除所有属于第一个字符集的字符
- -s 把连续重复的字符以单独一个字符表示,即去重
- -t 将第一个字符集对应字符转化为第二字符集对应的字符
范例:
[root@rocky01 ~]# echo 12345 |tr -d 25 134 [root@rocky01 ~]# echo aaabbbccccdffgg |tr -s abcf abcdfgg [root@rocky01 ~]# echo abcdef |tr 'a-z' 'A-Z' ABCDEF
30.用户和组管理命令
用户管理命令
- useradd
- usermod
- userdel
组帐号维护命令
- groupadd
- groupmod
- groupdel
(1)useradd 创建新的用户
常用选项
- -u UID
- -o 配合-u 选项,不检查UID的唯一性
- -g GID 指明用户所属基本组,可为组名,也可以GID
- -c "COMMENT“ 用户的注释信息
- -d HOME_DIR 以指定的路径(不存在)为家目录
- -s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
- -G GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在
- -N 不创建私用组做主组,使用users组做主组
- -r 创建系统用户 CentOS 6之前: ID<500,CentOS7 以后: ID<1000
- -m 创建家目录,用于系统用户
- -M 不创建家目录,用于非系统用户
- -p 指定加密的密码
useradd 命令默认值设定由/etc/default/useradd定义
[root@rocky01 ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
(2)usermod 修改用户属性
(3)userdel 删除用户
常见选项
- -f, --force 强制
- -r, --remove 删除用户家目录和邮箱
(4)id 查看用户的UID,GID等信息
(5)su: 切换用户身份,并且以指定用户的身份执行命令
切换用户的方式:
su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换
说明:root su至其他用户无须密码;非root用户切换时需要密码
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。
[root@rocky01 ~]# su rye [rye@rocky01 root]$ exit exit [root@rocky01 ~]#
(6)passwd 修改用户密码
(7)chage 修改用户密码策略
(8)groupadd 创建组
(9)groupmod 组属性修改
(10)groupdel 删除组
31.文件权限管理
(1)chown 设置文件的所有者
chown 命令可以修改文件的属主,也可以修改文件属组
[root@rocky01 ~]# ll 1.txt -rw-r--r--. 1 root root 0 Jul 27 16:20 1.txt [root@rocky01 ~]# chown rye:rye 1.txt [root@rocky01 ~]# ll 1.txt -rw-r--r--. 1 rye rye 0 Jul 27 16:20 1.txt
(2)chgrp 设置文件的属组信息
chgrp 命令可以只修改文件的属组
[root@rocky01 ~]# ll total 0 -rw-r--r--. 1 rye rye 0 Jul 27 16:20 1.txt [root@rocky01 ~]# chgrp root 1.txt [root@rocky01 ~]# ll total 0 -rw-r--r--. 1 rye root 0 Jul 27 16:20 1.txt #测试能否改属主 [root@rocky01 ~]# chgrp root:root 1.txt chgrp: invalid group: ‘root:root’ 结论:chgrp 命令可以只修改文件的属组
(3)chmod 修改文件权限
32.umask
umask的值可以用来保留在创建文件权限
实现方式:
- 新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
- 新建目录的默认权限: 777-umask
非特权用户umask默认值是 002
root的umask 默认值是 022
范例:
临时性修改文件权限为000:
方法一: [root@rocky01 ~]#touch a.txt; chmod 000 a.txt [root@rocky01 ~]#ll a.txt ----------. 1 root root 0 Jul 15 20:30 a.txt 方法二: [root@rocky01 ~]#umask 777; touch a.txt; umask 022; [root@rocky01 ~]#ll a.txt ----------. 1 root root 0 Jul 15 20:32 a.txt 方法三: [root@rocky01 ~]#(umask 777; touch a.txt) [root@rocky01 ~]#ll a.txt ----------. 1 root root 0 Jul 15 20:33 a.txt
33.vim
命令模式 --> 插入模式
- i insert,在光标所在处输入
- I 在当前光标所在行的行首输入
- a append,在光标所在处后面输入
- A 在当前光标所在行的行尾输入
- o 在当前光标所在行的下方打开一个新行
- O 在当前光标所在行的上方打开一个新行
扩展命令模式基本命令
- w 写(存)磁盘文件
- wq 写入并退出
- x 写入并退出
- X 加密
- q 退出
- q! 不存盘退出
- r filename 读文件内容到当前
- w filename 将当前文件内容写入另一个文件
- !command 执行命令
- r!command 读入命令的输出
(1)定制vim的工作特性
扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存
配置文件:
/etc/vimrc #全局 ~/.vimrc #个人
(1.1)行号
显示:set number,简写 set nu 取消显示:set nonumber, 简写 set nonu
(1.2)忽略字符的大小写
启用:set ignorecase,简写 set ic 不忽略:set noic
(1.3)自动缩进
启用:set autoindent,简写 set ai 禁用:set noai
(1.4)复制保留格式
启用:set paste 禁用:set nopaste
(1.5)显示Tab ^I和换行符 和$(不可见字符)
启用:set list 禁用:set nolist
(1.6)文件格式
启用windows格式:set fileformat=dos 启用unix格式:set fileformat=unix 简写 set ff=dos|unix
(1.7)Tab 用空格代替
启用:set expandtab 默认为8个空格代替Tab 禁用:set noexpandtab 简写:set et
(1.8)Tab用指定空格的个数代替
启用:set tabstop=# 指定#个空格代替Tab 简写:set ts=4
(1.9)设置缩进宽度
#向右缩进 命令模式>> #向左缩进 命令模式<< #设置缩进为4个字符 set shiftwidth=4
(1.10)设置光标所在行的标识线
启用:set cursorline,简写 set cul 禁用:set nocursorline
(1.11)加密
启用: set key=password 禁用: set key=
(2)命令模式
命令模式,又称为Normal模式,功能强大,只是此模式输入指令并在屏幕上显示,所以需要记忆大量的快捷按键才能更好的使用
(2.1)保存退出
ZZ 保存退出 ZQ 不保存退出
(2.2)行首行尾跳转
^ 跳转至行首的第一个非空白字符 0 跳转至行首 $ 跳转至行尾
(2.3)行间移动
:# 跳转至由第#行 G 最后一行 1G, gg 第一行
(2.4)字符编辑
x 剪切光标处的字符 #x 剪切光标处起始的#个字符 xp 交换光标所在处的字符及其后面字符的位置 ~ 转换大小写
(2.5)替换命令(replace)
r 只替换光标所在处的一个字符 R 切换成REPLACE模式(在末行出现-- REPLACE -- 提示),按ESC回到命令模式
(2.6)删除命令(delete)
d^ 删除到非空行首 d0 删除到行首 dd 剪切光标所在的行 #dd 删除光标开始的行到第#行 D 从当前光标位置一直删除到行尾,等同于d$ d$ 删除到行尾
(2.7)复制命令(yank)
yy:复制行 #yy 复制多行 Y:复制整行
(2.8)粘贴命令(paste)
小p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面 大P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
(2.9)查找
/查找关键字:从当前光标所在处向文件尾部查找 ?查找关键字:从当前光标所在处向文件首部查找 n:与命令同方向 N:与命令反方向
(2.10)撤消更改
u 撤销最近的更改,相当于windows中ctrl+z #u 撤销之前多次更改 U 撤消光标落在这行后所有此行的更改 . 重复前一个操作 #. 重复前一个操作#次
(3)可视化模式
在末行有”-- VISUAL -- “指示,表示在可视化模式
允许选择的文本块
- v 面向字符,-- VISUAL --
- V 面向整行,-- VISUAL LINE --
- ctrl-v 面向块,-- VISUAL BLOCK --
可视化键可用于与移动键结合使用
w ) } 箭头等
突出显示的文字可被删除,复制,变更,过滤,搜索,替换等
范例:在文件指定行的行首插入#
1、先将光标移动到指定的第一行的行首 2、输入ctrl+v 进入可视化模式 3、向下移动光标,选中希望操作的每一行的第一个字符 4、输入大写字母 I 切换至插入模式 5、输入 # 6、按 ESC 键
范例二:在指定的块位置插入相同的内容
1、光标定位到要操作的地方 2、输入ctrl+v 进入可视化模式,选取这一列操作多少行 3、输入大写字母 I 切换至插入模式 4、输入要插入的内容 5、按 ESC 键
34.cat 查看文本文件内容
常见选项
- -E:显示行结束符$
- -A:显示所有控制符
- -n:对显示出的每一行进行编号
- -b:非空行编号
- -s:压缩连续的空行成一行
35.tac逆向显示文本内容
36.rev将同一行的内容逆向显示
[root@rocky01 ~]# cat 1.txt 1 2 3 a b c A B C [root@rocky01 ~]# tac 1.txt A B C a b c 1 2 3 [root@rocky01 ~]# rev 1.txt 3 2 1 c b a C B A
37.hexdump查看非文本文件内容
[root@rocky01 ~]# hexdump -C -n 512 /dev/sda 00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............| 00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..| 00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u| ...省略...
38.分页查看文件内容
(1)more
(2)less
39.显示文本前面或后面的行内容
(1)head
显示文件或标准输入的前面行
常用选项:
- -c # 指定获取前#字节
- -n # 指定获取前#行,#如果为负数,表示从文件头取到倒数第#前
- -# 同上
[root@rocky01 ~]# echo a我b | head -c4 a我[root@rocky01 ~]#
(2)tail
显示文件或标准输入的倒数行
常用选项:
- -c # 指定获取后#字节
- -n # 指定获取后#行,如果#是负数,表示从第#行开始到文件结束
- -# 同上
- -f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文件,将无法继续跟踪文件
- -F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件
40.cut 按列抽取文本
常用选项
- -d DELIMITER: 指明分隔符,默认tab
- -f FILEDS:
- #: 第#个字段,例如:3
- #,#[,#]:离散的多个字段,例如:1,3,6
- #-#:连续的多个字段, 例如:1-6
- 混合使用:1-3,7
- -c 按字符切割
- --output-delimiter=STRING指定输出分隔符
41.rename:批量修改文件名
[root@rocky01 ~]# ls 0.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt [root@rocky01 ~]# rename txt sh *.txt [root@rocky01 ~]# ls 0.sh 1.sh 2.sh 3.sh 4.sh 5.sh 6.sh 7.sh 8.sh 9.sh
42.分析文本的工具
(1)wc 文本数据统计
常用选项
- -l 只计数行数
- -w 只计数单词总数
- -c 只计数字节总数
- -m 只计数字符总数
- -L 显示文件中最长行的长度
[root@rocky01 ~]# cat 1.txt 1 2 3 a b c A B C [root@rocky01 ~]# wc 1.txt 3 9 18 1.txt 行数 单词书 字节数 文件名
(2)sort 文本排序
把整理过的文本显示在标准输出,不改变原始文件
常用选项
- -r 执行反方向(由上至下)整理
- -R 随机排序
- -n 执行按数字大小整理
- -h 人类可读排序,如: 2K 1G
- -f 选项忽略(fold)字符串中的字符大小写
- -u 选项(独特,unique),合并重复项,即去重
- -t c 选项使用c做为字段界定符
- -k # 选项按照使用c字符分隔的 # 列来整理能够使用多次
(3)uniq 去重
常见选项
- -c: 显示每行重复出现的次数
- -d: 仅显示重复过的行
- -u: 仅显示不曾重复的行
范例:取两个文件的相同和不同的行
[root@centos8 data]#cat test1.txt a b 1 c [root@centos8 data]#cat test2.txt b e f c 1 2 #取文件的共同行 [root@centos8 data]#cat test1.txt test2.txt | sort |uniq -d 1 b c #取文件的不同行 [root@centos8 data]#cat test1.txt test2.txt | sort |uniq -u 2 a e f
(4)diff 比较两个文件之间的区别
[root@rocky01 ~]# cat 1.txt 7 8 9 a b c A B C [root@rocky01 ~]# cat 2.txt 4 5 6 d e f A B C [root@rocky01 ~]# diff 1.txt 2.txt 1,2c1,2 < 7 8 9 < a b c --- > 4 5 6 > d e f
(5)vimfidd 比较文件的区别
相当于vim -d
43.正则表达式
由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符
正则表达式分两类:
基本正则表达式:BRE Basic Regular Expressions
扩展正则表达式:ERE Extended Regular Expressions
(1)基本正则表达式
(1.1)字符匹配
- . 匹配任意单个字符(除了n),可以是一个汉字或其它国家的文字
- [ ] 匹配指定范围内的任意单个字符,示例:[peng] [0-9] [a-z] [a-zA-Z]
- [^] 匹配指定范围外的任意单个字符,示例:[^peng]
- [:alnum:] 字母和数字
- [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
- [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
- [:upper:] 大写字母
- [:blank:] 空白字符(空格和制表符)
(1.2)匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
- * #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
- .* #任意长度的任意字符
- ? #匹配其前面的字符出现0次或1次,即:可有可无
- + #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
- {n} #匹配前面的字符n次
- {m,n} #匹配前面的字符至少m次,至多n次
- {,n} #匹配前面的字符至多n次,<=n
- {n,} #匹配前面的字符至少n次
(1.3)位置锚定
位置锚定可以用于定位出现的位置
- ^ #行首锚定, 用于模式的最左侧
- $ #行尾锚定,用于模式的最右侧
- ^PATTERN$ #用于模式匹配整行
- ^$ #空行
- ^[[:space:]]*$ #空白行
- < 或 b #词首锚定,用于单词模式的左侧
- > 或 b #词尾锚定,用于单词模式的右侧
- <PATTERN> #匹配整个单词
#注意: 单词是由字母,数字,下划线组成
范例:排除掉空行和#开头的行 '^[^#]'
[root@rocky01 ~]# grep '^[^#]' /etc/fstab /dev/mapper/rl-root / xfs defaults 0 0 UUID=e52d90cb-d346-4305-9c4b-87bd670d4f4c /boot xfs defaults 0 0 /dev/mapper/rl-home /home xfs defaults 0 0 /dev/sr0 /media iso9660 defaults 0 0
(1.4)分组 ( )
分组:( ) 将多个字符捆绑在一起,当作一个整体处理
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: 1, 2, 3, ...
1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
注意: 表示正则表达式匹配的所有字符
(1.5)或者 |
- a|b #a或b
- C|cat #C或cat
- (C|c)at #Cat或cat
(2)扩展正则表达式
(2.1)字符匹配
- . 任意单个字符
- [peng] 指定范围的字符
- [^peng] 不在指定范围的字符
- [:alnum:] 字母和数字
- [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
- [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
- [:upper:] 大写字母
(2.2)次数匹配
- * 匹配前面字符任意次
- ? 0或1次
- + 1次或多次
- {n} 匹配n次
- {m,n} 至少m,至多n次
(2.3)位置锚定
- ^ 行首
- $ 行尾
- <, b 语首
- >, b 语尾
(2.4)分组、或者
( ) 分组
后向引用:1, 2, ... 注意: 表示正则表达式匹配的所有字符
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
44.文本处理三剑客
(1)grep
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
常见选项
- --color=auto 对匹配到的文本着色显示
- -m # 匹配#次后停止
- -v 显示不被pattern匹配到的行,即取反
- -i 忽略字符大小写
- -n 显示匹配的行号
- -c 统计匹配的行数
- -o 仅显示匹配到的字符串
- -q 静默模式,不输出任何信息
- -e 实现多个选项间的逻辑or关系
- -w 匹配整个单词
- -E 使用ERE,相当于egrep
- -F 不支持正则表达式,相当于fgrep
- -P 支持Perl格式的正则表达式
- -f file 根据模式文件处理
- -r 递归目录,但不处理软链接
- -R 递归目录,但处理软链接
(2)sed
sed 即 Stream EDitor,和 vi 不同,sed是行编辑器
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快
常用选项:
- -n 不输出模式空间内容到屏幕,即不自动打印
- -e 多点编辑
- -f FILE 从指定文件中读取编辑脚本
- -r, -E 使用扩展正则表达式
- -i.bak 备份文件并原处编辑
- -s 将多个文件视为独立文件,而不是单个连续的长文件流
说明:
- -ir 不支持
- -i -r 支持
- -ri 支持
- -ni 危险选项,会清空文件
查找替代:
- s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
- 替换修饰符:
- g 行内全局替换
- p 显示替换成功的行
- w /PATH/FILE 将替换成功的行保存至文件中
- I,i 忽略大小写
(3)akw
45.文件查找
非实时查找(数据库查找):locate
实时查找:find
(1)locate
- locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db
- 索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库
- 索引构建过程需要遍历整个根文件系统,很消耗资源
- locate和updatedb命令来自于mlocate包
工作特点:
- 查找速度快
- 模糊查找
- 非实时查找
- 搜索的是文件的全路径,不仅仅是文件名可能只搜索用户具备读取和执行权限的目录
[root@rocky01 ~]# yum install -y mlocate [root@rocky01 ~]# updatedb [root@rocky01 ~]# locate /root/*.txt /root/1.txt /root/2.txt
(2)find
find 是实时查找工具,通过遍历指定路径完成文件查找
格式:
find [OPTION]... [查找路径] [查找条件] [处理动作]
工作特点:
- 查找速度略慢
- 精确查找
- 实时查找
- 查找条件丰富
- 可能只搜索用户具备读取和执行权限的目录
常用查找条件
- -maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
- -mindepth level 最小搜索目录深度
- -depth 对每个目录先处理目录内的文件,再处理目录本身
- -name "文件名称" #支持使用glob,如:*, ?, [ ], [^],通配符要加双引号引起来
- -iname "文件名称" #不区分字母大小写
- -inum n #按inode号查找
- -samefile name #相同inode号的文件
- -links n #链接数为n的文件
- -type TYPE
- TYPE可以是以下形式:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
- -empty 空文件或目录
- -size [+|-]#UNIT #常用单位:k, M, G,c(byte),注意大小写敏感
- -perm 755 按权限查找
- 按时间查找 -amin-mmin-cmin
组合条件:
- 与:-a ,默认多个条件是与关系,所以可以省略-a
- 或:-o
- 非:-not !
[root@rocky01 ~]# find /etc/ -type d -o -type l |wc -l 307
处理动作:
- -print:默认的处理动作,显示至屏幕
- -ls:类似于对查找到的文件执行"ls -dils"命令格式输出
- -fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file
- -delete:删除查找到的文件,慎用!
- -ok COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
- -exec COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令
- { }: 用于引用查找到的文件名称自身
(3)xargs
xargs参数替换
由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为参数
[root@rocky01 ~]# echo 666 > 1.txt |xargs cat 1.txt 666
46.打包和解包
tar
- -z 相当于gzip压缩工具
- -j 相当于bzip2压缩工具
- -J 相当于xz压缩工具
打包 .tar.gz:tar zcvf
解包 .tar.gz:tar zxvf
47.管理分区
(1)lsblk 列出块设备
(2)fdisk 创建分区
(3)partprobe 同步分区表
48.文件系统管理
(1)mkfs 创建文件管理工具
mkfs.FS_TYPE /dev/DEVICE
mkfs -t FS_TYPE /dev/DEVICE
常用选项
- -t {ext2|ext3|ext4|xfs} 指定文件系统类型
- -b {1024|2048|4096} 指定块 block 大小
- -L ‘LABEL’ 设置卷标
(2)blkid 查看块设备属性信息
49.挂载
同一个设备可以同时挂载到多个挂载点
一个挂载点不能同时挂载多个设备
(1)mount 挂载文件系统
(2)umount 卸载文件系统
50.磁盘常见工具
(1)df 文件系统空间实际真正占用等信息的查看工具
常用选项
- -H 以10为单位
- -T 文件系统类型
- -h human-readable
- -i inodes instead of blocks
- -P 以Posix兼容的格式输出
(2)du 查看某目录总体空间实际占用状态
常用选项
- -a --all 显示所有文件和目录的大小,默认只显示目录大小
- -h human-readable
- -s 仅显示每个参数的总计
- --max-depth=# 指定最大目录层级
- -x, --one-file-system #忽略不在同一个文件系统的目录
(3)dd
格式:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
常用选项
- if=file 从所命名文件读取而不是从标准输入
- of=file 写到所命名的文件而不是到标准输出
- ibs=size 一次读size个byte
- obs=size 一次写size个byte
- bs=size block size, 指定块大小(既是是ibs也是obs)
- cbs=size 一次转化size个byte
- skip=blocks 从开头忽略blocks个ibs大小的块
- seek=blocks 从开头忽略blocks个obs大小的块
- count=n 复制n个bs
51.逻辑卷管理器(LVM)
实现过程
- 将设备指定为物理卷
- 用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的
- 在物理卷上创建的逻辑卷, 是由物理区域(PE)组成
- 可以在逻辑卷上创建文件系统并挂载
#相关工具来自于 lvm2 包 [root@rocky01 ~]# yum -y install lvm2
(1)pv管理工具
显示pv信息
pvs:简要pv信息显示 pvdisplay
创建pv
[root@rocky01 ~]# pvcreate /dev/DEVICE
删除pv
[root@rocky01 ~]# pvremove /dev/DEVICE
(2)vg管理工具
显示卷组
vgs vgdisplay
创建卷组
#示例 vgcreate -s 16M testvg /dev/sdb /dev/sdc #-s 指定PE的大小,默认4M
删除卷组
- 先做pvmove
- 再做vgremove
(3) lv管理工具
显示逻辑卷
lvs Lvdisplay
创建逻辑卷
#示例 lvcreate -l 60%VG -n mylv testvg lvcreate -l 100%FREE -n yourlv testvg
删除逻辑卷
lvremove /dev/VG_NAME/LV_NAME
范例:总
#创建物理卷 [root@rocky01 ~]# pvcreate /dev/sda3 #为卷组分配物理卷 [root@rocky01 ~]# vgcreate vg0 /dev/sda3 #从卷组创建逻辑卷 [root@rocky01 ~]# lvcreate -L 256M -n data vg0 [root@rocky01 ~]# mkfs.xfs /dev/vg0/data #挂载 [root@rocky01 ~]# mount /dev/vg0/data /mnt/data
52.扩展和缩减逻辑卷
(1)在线扩展逻辑卷
#两步实现 #第一步实现逻辑卷的空间扩展 lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME #第二步实现文件系统的扩展 #针对ext resize2fs /dev/VG_NAME/LV_NAME #针对xfs xfs_growfs MOUNTPOINT #一步实现容间和文件系统的扩展 lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
(2)缩减逻辑卷
注意:缩减有数据损坏的风险,建议先备份再缩减,xfs文件系统不支持缩减
umount /dev/VG_NAME/LV_NAME e2fsck -f /dev/VG_NAME/LV_NAME resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT] lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME mount /dev/VG_NAME/LV_NAME mountpoint #或者可以简写 umount /dev/VG_NAME/LV_NAME lvreduce -L #[mMgGtT] -r /dev/VG_NAME/LV_NAME mount /dev/VG_NAME/LV_NAME mountpoint
53.逻辑卷快照
(1)原理、特点
逻辑卷快照工作原理
- 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
- 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
- 快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
快照特点:
- 备份速度快,瞬间完
- 应用场景是测试环境,不能完成代替备份
- 快照后,逻辑卷的修改速度会一定有影响
(2)实现逻辑卷快照
范例
mkfs.xfs /dev/vg0/data mount /dev/vg0/data/ /mnt/data #为现有逻辑卷创建快照,注意ext4建议使用-p r 实现只读 lvcreate -l 64 -s -n data-snapshot /dev/vg0/data #挂载快照,xfs注意要使用-o ro实现只读,防止快照被修改 mkdir -p /mnt/snap mount -o ro,nouuid /dev/vg0/data-snapshot /mnt/snap #恢复快照 umount /dev/vg0/data-snapshot umount /dev/vg0/data lvconvert --merge /dev/vg0/data-snapshot #删除快照 umount /mnt/snap lvremove /dev/vg0/data-snapshot
54.软件管理
(1)rpm 包管理器
功能:安装、卸载、升级、查询、校验、数据库维护
常用选项
- -i:表示安装。
- -v, -vv, -vvv:表示详细信息。
- -h:以"#"号显示安装进度。
- -q:查询指定包名。
- -e:卸载指定包名。
- -U:升级软件,若未软件尚未安装,则安装软件。
- -F:升级软件。
- -V:对RPM包进行验证
- –nodeps:忽略依赖关系
- -K 包校验
- rpm -q:查询某一个RPM包是否已安装
- rpm -qi:查询某一个RPM包的详细信息
- rpm -ql:列出某RPM包中所包含的文件。
- rpm -qf:查询某文件是哪个RPM包生成的。
- rpm -qa:列出当前系统所有已安装的包
55.yum和dnf
CentOS 使用 yum, dnf 解决rpm的包依赖关系
YUM: Yellowdog Update Modififier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具,CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的
yum和dnf用法一致
注:yum仓库指向的路径一定必须是repodata目录所在目录
yum的repo配置文件中可用的变量:
- $releasever: 当前OS的发行版的主版本号,如:8,7,6
- $arch: CPU架构,如:aarch64, i586, i686,x86_64等
- $basearch:系统基础平台;i386, x86_64
- $contentdir:表示目录,比如:centos-8,centos-7
- $YUM0-$YUM9:自定义变量
yum客户端配置文件
/etc/yum.conf #为所有仓库提供公共配置 /etc/yum.repos.d/*.repo: #为每个仓库的提供配置文件
yum服务器的baseurl形式
file:// 本地路径 http:// https:// ftp://
仓库配置
[root@rocky01 ~]# ll /media/BaseOS/ total 8 dr-xr-xr-x. 28 root root 4096 May 16 05:06 Packages dr-xr-xr-x. 2 root root 4096 May 16 05:06 repodata [root@rocky01 ~]# cat /etc/yum.repos.d/epel.repo [epel] name=epel baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/ https://mirror.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/ gpgchek=1 gpgkey=https://mirror.tuna.tsinghua.edu.cn/epel/RPM-GPG-KEY-EPEL-8 enabled=1 [root@rocky01 ~]# cat /etc/yum.repos.d/local.repo [AppStream] name=AppStream baseurl=file:///media/AppStream https://mirror.nju.edu.cn/rocky/$releasever/BaseOS/$releasever/os/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial https://mirror.nju.edu.cn/rocky/RPM-GPG-KEY-Rocky-8 enabled=1 [BaseOS] name=BaseOS baseurl=file:///media/BaseOS https://mirror.nju.edu.cn/rocky/$releasever/BaseOS/$releasever/os/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial https://mirror.nju.edu.cn/rocky/RPM-GPG-KEY-Rocky-8 enabled=1
显示程序包
[root@rocky01 ~]# yum list tree Last metadata expiration check: 1:11:48 ago on Thu 28 Jul 2022 09:31:15 PM CST. Installed Packages tree.x86_64 1.7.0-15.el8 @BaseOS #注:最后面的@BaseOS指的是用哪个源,有@代表已经安装此软件
安装程序包
yum install package1
查询
#查看程序包详细信息 yum info mysql #已安装和未安装都可查 rpm -qi mysql #已安装才可查 #查看指定的特性(可以是某文件)是由哪个程序包所提供 [root@rocky01 ~]# yum provides /etc/fstab #注:文件要写全路径,而不只是文件名,否则可能无法查询到
仓库缓存
#清除目录/var/cache/yum/缓存 yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] #构建缓存 yum makecache #范例:管理yum缓存 [root@rocky01 ~]# du -sh /var/cache/dnf/ 82M /var/cache/dnf/ [root@rocky01 ~]# yum clean all 50 files removed [root@rocky01 ~]# du -sh /var/cache/dnf/ 1.5M /var/cache/dnf/ [root@rocky01 ~]# yum makecache epel 5.0 MB/s | 13 MB 00:02 AppStream 120 MB/s | 7.8 MB 00:00 BaseOS 102 MB/s | 2.6 MB 00:00 Metadata cache created. [root@rocky01 ~]# du -sh /var/cache/dnf/ 57M /var/cache/dnf/
查看yum事务历史
[root@rocky01 ~]# yum history
56.程序包编译
(1)C 语言源代码编译安装过程
利用编译工具,通常只需要三个大的步骤
- ./confifigure
- (1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefifile.in文件生成Makefifile
- (2) 检查依赖到的外部环境,如依赖的软件包
- make 根据Makefifile文件,会检测依赖的环境,进行构建应用程序
- make install 复制文件到相应路径
注意:安装前可以通过查看README,INSTALL获取帮助
(2)编译安装实战案例
#1 安装相关的依赖包 [root@rocky01 ~]# yum install gcc make #2 下载源码并解压 [root@rocky01 ~]# tar xvf tree-1.8.0.tgz #3 进入解压缩的目录,README和INSTALL [root@rocky01 ~]# cd tree-1.8.0/ [root@rocky01 tree-1.8.0]# cat README [root@rocky01 tree-1.8.0]# cat INSTALL #4 修改源码的版本号 [root@rocky01 tree-1.8.0]# sed -i 's#v1.8.0#v8.8.8#' tree.c #5 编译准备 5.4.4.2 编译安装 cmatrix [root@rocky01 tree-1.8.0]# vim Makefile prefix = /apps/tree #6 编译 [root@rocky01 tree-1.8.0]# make #7 安装 [root@rocky01 tree-1.8.0]# make install #8 修改PATH变量 #默认无法直接运行tree [root@rocky01 ~]# tree -bash: tree: command not found [root@rocky01 ~]# echo 'PATH=/apps/tree/bin:$PATH' > /etc/profile.d/tree.sh . /etc/profile.d/tree.sh #或者利用软链接实现 [root@rocky01 ~]# ln -s /apps/tree/bin/tree /usr/local/bin #9 验证结果 [root@rocky01 ~]# tree --version tree v8.8.8 (c) 1996 - 2018 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro #10 添加man帮助 #默认无法查看man [root@rocky01 ~]# man tree No manual entry for tree [root@rocky01 ~]# vim /etc/man_db.conf MANDATORY_MANPATH /apps/tree/man [root@rocky01 ~]# man tree #11 运行tree查看生成的文件列表 [root@rocky01 ~]# tree /apps/tree /apps/tree ├── bin │ └── tree └── man └── man1 └── tree.1