运维云计算SRE-第2周
1. 总结学过的权限,属性及ACL相关命令及选项,示例。
一、Linux安全模型
 (一)资源分派
 Authentication(认证):验证用户身份,确保登录系统的用户是合法的。
 Authorization(授权):根据用户身份设置不同的权限,决定用户可以对系统资源进行哪些操作。
 Accouting(审计):记录用户的行为,用于事后审查,例如通过查看登录日志来了解用户的登录情况。
 (二)3A认证
 是一套针对网络设备的网络访问控制策略安全模型,用于保障网络访问的安全性。
 (三)安全上下文
 运行中的程序(进程)以进程发起者的身份运行,其访问资源的权限取决于发起者的身份。只有具有相应权限的用户才能执行程序,并且程序在访问文件等资源时,其权限也由发起者的身份决定。
 二、用户和组相关概念
 (一)用户
 用户类型
 超级管理员:root用户,UID为0,拥有最高权限,可以对系统进行任何操作。
 系统用户:CentOS 6以前为1 - 499,CentOS 7以后为1 - 999,这些用户主要用于给后台程序使用,如nginx、mysql等守护进程。
 登录用户:CentOS 6以前为500+,CentOS 7以后为1000+,用于用户进行交互式登录。
 (二)用户组
 用户组类型
 超级管理员组:root组,GID为0,供超级管理员使用。
 系统组:CentOS 6以前为1 - 499,CentOS 7以后为1 - 999,用于守护进程获取资源权限分配。
 普通组:CentOS 6以前为500+,CentOS 7以后为1000+,供普通登录用户使用。
 (三)用户和组的关系
 一个用户至少有一个组,其中有一个主组(primary group),创建用户时默认会创建与其同名的组作为主组,用户也可以属于0个或多个附加组(supplementary group)。可以通过组对用户进行批量管理,例如对一个组授权,组内所有用户都能继承该组的权限。
 三、用户和组相关配置文件
 (一)主要配置文件
 /etc/passwd:存储用户及其属性信息,包括登录用户名、密码占位符、UID、所属组ID、用户全名或注释、用户家目录以及用户默认shell等。
 /etc/shadow:存储用户密码及其相关属性,如加密后的密码、上次修改密码的时间、密码有效期等信息,只有root用户有读权限。
 /etc/group:存储组及其属性信息,包括组名、组密码占位符、组ID以及组成员列表等。
 /etc/gshadow:存储组密码及其相关属性,如加密后的组密码、组管理员以及组成员列表等。
 (二)文件操作
 可以使用专用工具来修改这些文件,如vipw和vigr用于编辑相关文件,pwck和grpck用于检查用户和组相关配置文件的正确性。也可以使用getent命令根据用户名查看配置项。
 四、用户和组管理命令
 (一)用户管理命令
 useradd
 用于创建新的Linux用户,可以指定多种选项,如UID、用户组、家目录、shell、是否创建系统用户、是否创建家目录、设置密码、指定附加组等。
 usermod
 用于修改用户属性,包括修改注释、家目录、过期日期、密码过期后的处理方式、组、附加组、登录名称、锁定或解锁用户帐号、修改密码、修改shell、修改UID等。
 userdel
 用于删除Linux用户,可以选择是否强制删除以及是否删除家目录和邮件目录。
 id
 用于查看用户的UID、GID等信息,可以显示详细信息,也可以只显示特定的信息,如主组ID、附加组ID、用户名或组名等。
 su
 用于切换用户身份,可以进行登录式切换(读取目标用户的配置文件,切换至目标用户的家目录)和非登录式切换(不读取目标用户的配置文件,不改变当前工作目录),还可以在不切换用户的情况下,使用目标用户的权限和环境执行命令。
 passwd
 用于修改用户密码,可以进行多种操作,如锁定、解锁、删除密码、设置密码有效期、提醒用户密码过期等,普通用户修改自己密码需要先验证当前使用的密码。
 chage
 用于修改用户密码策略,包括更改密码的时间、设置密码最短有效期、最长有效期、警告期、密码过期后的宽限期以及用户的有效期等,还可以查看用户的密码策略。
 (二)组管理命令
 groupadd
 用于创建组,可以指定组ID、是否为系统组、是否允许重复GID、设置组密码等。
 groupmod
 用于修改组属性,如修改组ID、组名以及组密码等。
 groupdel
 用于删除组,强制删除可能导致无主组的用户不可用无法登录。
 gpasswd
 用于更改组密码,也可以修改附加组的成员关系,在组没有密码的情况下,加组操作只能由root用户进行。
 groupmems
 用于管理附加组的成员关系,可以添加、删除成员,查看成员列表,清除所有成员等,只有root用户可以更改指定组的成员关系。
 五、文件权限管理
 (一)权限体系介绍
 角色
 属主(owner):文件的所有者,通常是创建文件的用户。
 属组(group):文件所属的组,用户可以属于多个组,文件所属组决定了组内用户对文件的权限。
 其它用户(other):不属于属主和属组的用户。
 权限
 读(r,4):对文件来说,可查看文件内容;对目录来说,可读取目录中的文件名,但无法查看文件元数据。
 写(w,2):对文件来说,可修改文件内容;对目录来说,可在目录中创建文件和删除文件。
 执行(x,1):对文件来说,可执行文件,发起一个进程;对目录来说,可进入目录,可查看文件元数据,可查看文件内容。
 (二)文件所有者和属组属性操作
 chown
 用于修改文件的属主和属组,可以只修改所有者、只修改属组或同时修改所有者和属组,还可以根据原属主属组进行修改,支持递归操作以及多种选项,如显示过程、不显示错误信息等。
 chgrp
 用于只修改文件的属组,支持类似chown的多种选项和操作方式,如递归修改、根据文件修改等。
 (三)文件权限操作
 chmod
 用于修改文件权限,可以使用字符表示法(如u+r表示属主加读权限)或八进制数字表示法(如644表示属主可读写,属组可读,其它用户可读),支持递归操作以及多种选项,如显示过程、不显示错误信息等。
 (四)新建文件和目录的默认权限
 新建文件的默认权限为666 - umask,新建目录的默认权限为777 - umask。umask值间接影响新建文件和目录的权限,非特权用户umask默认是002,root的umask默认是022,可以通过umask命令查看和修改umask值,并且可以在全局设置文件(如/etc/bashrc、/etc/bash.bashrc或~/.bashrc)中持久保存umask设置。
 (五)特殊权限
 SUID(4)
 作用于二进制可执行文件上,用户执行该文件时将继承此程序所有者的权限。可以通过chmod命令设置SUID权限,例如chmod u+s FILE。
 SGID(2)
 作用于二进制可执行文件上,用户执行该文件时将继承此程序所有组的权限;作用于目录上,此目录中新建的文件的所属组将自动从此目录继承。可以通过chmod命令设置SGID权限,例如chmod g+s FILE或chmod g+s DIR。
 Sticky(1)
 作用于目录上,此目录中的文件只能由所有者自己或root来删除。可以通过chmod命令设置Sticky权限,例如chmod o+t DIR。
 (六)访问控制列表ACL
 ACL权限功能
 提供更细粒度的权限控制,可以单独对指定的用户设定各不相同的权限,弥补了rwx权限体系只能将用户分成三种角色的不足。CentOS7默认创建的xfs和ext4文件系统具有ACL功能,CentOS7之前版本需要手动增加。
 ACL相关命令
 setfacl:用于设置ACL权限,可以修改、删除ACL权限,设置默认ACL,递归执行等操作。
 getfacl:用于查看设置的ACL权限
#linux用户管理总结
vipw|vigr  g|--group   #编辑 group 文件
vipw|vigr -p|--passwd   #编辑 passwd 文件
vipw  -s|--shadow   #编辑 /etc/shadow 
vigr  -s|--shadow    #/etc/gshadow 文件
pwck -q|--quiet           #只报告错误,忽略警告
pwck  -r|--read-only       #显示错误和警告,但不改变文件
pwck  -R|--root CHROOT_DIR #chroot 到的目录
pwck  -s|--sort             #通过 UID 排序项目
grpck -r|--read-only          #显示错误和警告,但不改变文件
grpck -R|--root CHROOT_DIR    #chroot 到的目录
grpck -s|--sort               #通过 UID 排序项目
getent passwd|shadow|group|gshadow username #查看passwd|shadow|group|gshadow中username信息id username #查看用户id,用户组id,用户属组
id -a  username  #显示详细信息,默认选项
id -Z|--context username #仅显示安全上下文信息,要开启selinux 配置才有
id -g|--group  username   #仅显示GID,就是只显示主组ID
id -G|--groups  username #显示主组和附加组ID,就是所有组ID
id -n|--name   username  #显示用户名或组名,要组合使用 -nu|-ng|-nG
id -u|--user   username #仅显示UIDsu -m|-p|--preserve-environment username #不重置环境变量
su -g|--group group  username               #指定主组,只有root 切普通用户才能指定此参数
su -|-l|--login    username              #完全切换
su -c|--command command   username          #不切换用户,而是临时使用该用户权限和环境执行命令
su --session-command command    username    #使用上同 -c 选项,但不会创建会话
su -f|--fast     username #向shell 传递 -f 选项(csh 或 tcsh)
su-s|--shell shell  username #切换用户后,指定 /etc/shells中的shell环境, 
su -P|--pty         username#开一个新的终端useradd -u|--uid UID username   #指定UID
useradd -g|--gid GID   username   #指定用户组,-g groupname|--gid GID
useradd -c|--comment COMMENT username  #新账户的 GECOS 字段
useradd -d|--home-dir HOME_DIR  username #指定家目录,可以是不存在的,指定家目录,并不代表创建
useradd s|--shell SHELL username   #指定 shell,可用shell在/etc/shells 中可以查看
useradd -r|--system  username             #创建系统用户,CentOS 6之前 ID<500,CentOS7 以后
useradd  -m|--create-home  username       #创建家目录,一般用于登录用户
useradd  -M|--no-create-home  username     #不创建家目录,一般用于不用登录的用户
useradd -p|--password PASSWORD  username  #设置密码,这里的密码是以明文的形式存在
useradd -o|--non-unique   username        #允许使用重复的 UID 创建用户
useradd -G|--groups GROUP1[,GROUP2,...]   username #为用户指明附加组,组须事先存在
useradd -N|--no-user-group   username    #不创建同名的组,使用users组做主组
useradd -D|--defaults        username    #显示或更改默认的 useradd 配置,/etc/default/useradd
useradd -e|--expiredate EXPIRE_DATE username #指定账户的过期日期 YYYY-MM-DD 格式
useradd -f|--inactive INACTIVE  username     #密码过期之后,账户被彻底禁用之前的天数
useradd -k|--skel SKEL_DIR username#创建家目录,生成默认文件,默认是/etc/skel/,要配合-m
useradd  -K|--key KEY=VALUE username  #不使用 /etc/login.defs 中的默认值,自己指定
useradd-l|--no-log-init username#不将用户添加到最近登录和登录失败记录usermod -c|--comment COMMENT username #修改注释
usermod -d|--home HOME_DIR username    #修改家目录
usermod -e|--expiredate EXPIRE_DATE username   #修改过期的日期,YYYY-MM-DD 格式
usermod -f|--inactive INACTIVE  username     #密码过期之后,账户被彻底禁用之前的天数
usermod -g|--gid GROUP      username  #修改组
usermod -G|--groups GROUPS  username  # 新附加组,原来的附加组将会被覆盖;若保留同时使用-a选项
usermod -a|--append GROUP   username #将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除
usermod -l|--login LOGIN   username          #新的登录名称
usermod -L|--lock    username                #锁定用户帐号,在/etc/shadow 密码栏的增加 !
usermod -m|--move-home username              #将家目录内容移至新位置,和 -d 一起使用
usermod -o|--non-unique  username            #允许使用重复的(非唯一的) UID
usermod -p|--password PASSWORD username #修改密码,这里是明文,如果要修改密码,则要用加密后
usermod -s|--shell SHELL   username  #修改 shell
usermod -u|--uid UID username        #修改 UID
usermod -U|--unlock username          #解锁用户帐号,将 /etc/shadow 密码栏的!拿掉userdel -f|--force  username  #强制删除,哪怕用户正在登录状态
userdel -r|--remove  username #删除家目录和邮件目录passwd -k|--keep-tokens username      #保持身份验证令牌不过期
passwd -d|--delete    username        #删除用户密码,也删除密码锁,仅root有权限操作
passwd -l|--lock      username        #锁定用户密码,仅root有权限操作
passwd -u|--unlock   username         #解锁用户密码,仅root有权限操作
passwd -e|--expire     username       #终止用户密码,用户下次登录成功后要立马修改,仅root
passwd -f|--force     username        #强制执行操作
passwd -x|--maximum=DAYS  username    #指定用户密码最长有效期,仅root有权限操作
passwd -n|--minimum=DAYS username   #指定用户密码最短有效期,仅root有权限操作
passwd -w|--warning=DAYS  username   #在密码过期前多少天开始提醒用户,仅root有权限操作
passwd -i|--inactive=DAYS username  #当密码过期后少天该用户账号会被禁用,仅root有权限操作
passwd -S|--status   username      #查询用户的密码状态,仅root有权限操作
passwd --stdin    username       #从标准输入接收密码,Ubuntu无此选项chage -d LAST_DAY  username#更改密码的时间
chage -m|--mindays username#MIN_DAYS
chage -M|--maxdays username#MAX_DAYS
chage -W|--warndays username#WARN_DAYS
chage -I|--inactive INACTIVE username#密码过期后的宽限期
chage -E|--expiredate EXPIRE_DATE username#用户的有效期
chage -l username#显示密码策略groupadd -f|--force   groupname   #如果组已经存在则成功退出
groupadd -g|--gid GID   groupname  #指定组ID,默认系统分配,指定值不要超过[GID_MIN,GID_MAX]
groupadd -K|--key KEY=VALUE   groupname   #不使用 /etc/login.defs 中的默认值,自己指定,
groupadd -o|--non-unique    groupname     #允许创建有重复 GID 的组
groupadd -p|--password PASSWORD  groupname#为新组使用此加密过的密码
groupadd -r|--system    groupname  #创建一个系统组 CentOS 6之前groupmod -g|--gid GID     groupname #将组 ID 改为 GID
groupmod -n|--new-name NEW_GROUP  groupname #改名为 NEW_GROUP
groupmod -o|--non-unique        groupname #允许使用重复的 GID
groupmod -p|--password PASSWORD  groupname #将密码更改为(加密过的) PASSWORD
groupdel -f|--force  groupname#强制删除 gpasswd  -a|--add username  groupname#向组中添加用户
gpasswd  -d|--delete username  groupname#从组中移除用户
gpasswd  -r|--delete-password  groupname#删除组密码
gpasswd  -R|--restrict        groupname#向其成员限制访问组 GROUP
gpasswd -M|--members USER,...    groupname#批量加组
gpasswd  -A|--administrators ADMIN,...  groupname#批量设组管理员groupmems -g|--group groupname   #更改为指定组 (只有root)
groupmems -a|--add username     #指定用户加入组
groupmems -d|--delete username #从组中删除用户
groupmems -p|--purge groupname  #从组中清除所有成员
groupmems -l|--list   groupname  #显示组成员列表




#linux用户权限总结
chown -c|--changes  filename  #同-v选项,但只显示更新成功的信息
chown -f|--silent|--quiet filename  #不显示错误信息
chown -v|--verbose        filename  #显示过程
chown --dereference        filename #修改的是符号链接指向的文件,而不是链接文件本身
chown -h|--no-dereference   filename#修改的是符号链接文件,而不是其指向的目标文件
chown --from=user:group    filename #根据原属主属组来修改,相当于一个查询条件
chown --no-preserve-root   filename #不特别对待“/”,意思就是将根目录当成普通目录来执行,
chown --preserve-root      filename #不允许在"/"上递归操作
chown --reference=RFILE    filename #复制该文件的属主属组信息给指定文件
chown-R|--recursive        filename#递归操作
#下列选项配合 -R 使用
chown -H                   filename #如果参数是指向目录的软链接,则只修改指向的目录,
chown -L                   filename #更改所有遇到的符号链接指向的目录
chown -P                   filename #不更改符号链接指向的目录chgrp -c|--changes     filename      #同-v选项,但只显示更新成功的信息
chgrp -f|--silent|--quiet  filename  #不显示错误信息
chgrp -v|--verbose      filename     #显示过程
chgrp --dereference       filename   #修改的是符号链接指向的文件,而不是链接文件本身
chgrp -h|--no-dereference  filename  #修改的是符号链接文件,而不是其指向的目标文件
chgrp --no-preserve-root    filename #不特别对待“/”,意思就是将家目录当成普通目录来执行
chgrp --preserve-root     filename   #不允许在"/"上递归操作
chgrp --reference=RFILE   filename   #复制该文件的属主属组信息给指定文件
chgrp -R|--recursive      filename   #递归操作
#下列选项配合 -R 使用,
chgrp -H         filename   #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件
chgrp -L          filename#更改所有遇到的符号链接指向的目录
chgrp -P           filename #不更改符号链接指向的目录chmod -c|--changes      filename    #同-v选项,但只显示更新成功的信息
chmod -f|--silent|--quiet  filename  #不显示错误信息
chmod -v|--verbose         filename #显示过程
chmod --no-preserve-root   filename #不特别对待“/”,意思就是将家目录当成普通目录来执行
chmod --preserve-root      filename  #不允许在"/"上递归操作
chmod --reference=RFILE    filename  #根据其它文件权限来操作,复制该文件的权限信息给指定文件
chmod -R|--recursive     filename   #递归操作umask  -p    #如果省略 MODE 模式,以可重用为输入的格式输入
umask  -S    #以字符显示
umask  u=rw,g=r,o= #设置创建文件权限chmod u+s filename... #添加文件SUID权限
chmod 4xxx filename #添加文件SUID权限 
chmod u-s filename...#去除文件SUID权限
chmod g+s filename... #添加文件SGID权限
chmod 2xxx filename#添加文件SGID权限
chmod g-s filename...#添加文件SGID权限
chmod o+t dirname...#添加文件Sticky权限
chmod 1xxx dirname #添加文件Sticky权限
chmod o-t dirname...#添加文件Sticky权限
chattr -p filename #设置文件项目编号
chattr -R  filename   #递归执行
chattr -V   filename  #显示过程,并输出chattr 版本
chattr -f  filename   #不输出错误信息
chattr -v version filename #设置版本
lsattr filename #显示文件属性setfacl -m|--modify=acl   filename      #修改acl权限
setfacl -M|--modify-file=file filename#从文件读取规则
setfacl -x|--remove=acl    filename     #删除文件acl 权限
setfacl -X|--remove-file=file filename#从文件读取规则
setfacl -b|--remove-all       filename  #删除文件所有acl权限
setfacl -k|--remove-default   filename  #删除默认acl规则
setfacl --set=acl           filename    #用新规则替换旧规则,会删除原有ACL项,用新的替代
setfacl --set-file=file  filename  #从文件读取新规则
setfacl --mask       filename   #重新计算mask值
setfacl -n|--no-mask   filename #不重新计算mask值
setfacl -d|--default    filename  #在目录上设置默认acl
setfacl -R|--recursive  filename #递归执行
setfacl -L|--logical    filename #将acl 应用在软链接指向的目标文件上,与-R一起使用
setfacl -P|--physical     filename #将acl 不应用在软链接指向的目标文件上,与-R一起使用
setfacl -m mask::rx filename #mask权限
getfacl filename #查看权限列表





2. 结合vim几种模式,学会使用vim几个常见操作。
 
1)如何打开文件。并在打开文件(命令模式)之后如何退出文件。
打开文件
 在终端中输入vim 文件名即可打开指定文件。例如,如果要打开名为test.txt的文件,可以输入vim test.txt。此时进入命令模式。
退出文件
 1、命令模式->命令扩展模式 退出
 如果没有对文件进行任何修改,先输入: 进入命令扩展模式,再输入q就可以退出文件。
 如果对文件进行了修改但不想保存,先输入:进入命令扩展模式,再输入q!强制退出(会放弃所有修改)。
 如果对文件进行了修改并且想要保存后退出,先输入:进入命令扩展模式,在输入wq(先保存再退出)。
 2、命令模式 退出
 输入ZZ保存修改就可以退出文件。
 输入ZQ不保存修改就可以退出文件。
2)打开文件(命令模式)之后,进入插入模式。并在插入模式中如何回到打开文件的状态(命令模式),并在命令模式之后如何退出文件。
3)打开文件(命令模式)之后,进入插入模式,编写一段话,"马哥出品,必属精品", 之后从插入模式中如何回到打开文件的状态(命令模式),并在命令模式之后如何退出文件。
从命令模式进入插入模式
 在命令模式下,可以使用以下按键进入插入模式:
 i:在光标当前位置插入。
 a:在光标当前位置的下一个字符处插入。
 o:在光标所在行的下一行插入新的一行并进入插入模式。
 I:在光标所在行的行首插入。
 A:在光标所在行的行尾插入。
从插入模式回到命令模式
 在插入模式下,按下Esc键即可回到命令模式。
 完成特定内容编写后的操作(包含插入、返回命令模式和退出)
 按照要求,在打开文件(命令模式)后进入插入模式(如按i),输入 “马哥出品,必属精品”。
 然后按Esc键回到命令模式。
 若要保存并退出,可以输入:wq;若不想保存并退出,输入:q!;若只是想保存不退出,输入:w。
4)使用cat命令验证文件内容,是刚刚自己写的内容。
在完成上述文件的编辑并保存退出后,可以使用cat命令来查看文件内容。
 如果编辑的文件名为test.txt,在终端输入cat test.txt,就可以看到文件中的内容是否为刚刚自己编写的 “马哥出品,必属精品”。
5)(可选),命令模式下,光标在单词,句子上进行前后,上下跳转。行复制粘贴。行删除。
光标跳转
 在单词间跳转:
 w:将光标移至下一个单词的开头。
 b:将光标移至上一个单词的开头。
 e:将光标移至当前单词的末尾。
 在句子间跳转:
 ):将光标移至下一个句子的开头。
 (:将光标移至上一个句子的开头。
 上下跳转:
 j:光标向下移动一行。
 k:光标向上移动一行。
 行复制粘贴
 复制行:在命令模式下,将光标移至要复制的行,按yy(复制当前行),若要复制多行,可以使用数字yy(例如3yy表示复制从当前行开始的 3 行)。
 粘贴行:将光标移至要粘贴的位置,按p(粘贴在光标所在行的下一行)或者P(粘贴在光标所在行的上一行)。
 行删除
 在命令模式下,将光标移至要删除的行,按dd即可删除当前行。若要删除多行,可以使用数字dd(例如3dd表示删除从当前行开始的 3 行)
3. 总结学过的文本处理工具,文件查找工具,文本处理三剑客, 文本格式化命令(printf)的相关命令及选项,示例。
 
一、文本处理工具
1. cat
 命令格式:cat [选项] [文件]
 常用选项及功能
 -n:为所有行编号(包括空行)。
 -b:只为非空行编号。
 -E:在每行末尾显示$表示行尾。
 -T:将制表符显示为^I。
 示例
 查看文件并显示所有行号:cat -n file.txt
 查看文件并只对非空行编号:cat -b file.txt
 2. more
 命令格式:more [选项] [文件]
 常用选项及功能
 -d:显示详细的操作提示信息。
 -s:将连续的空行压缩为一行。
 示例
 分页查看文件并显示提示:more -d file.txt
 查看文件并压缩空行:more -s file.txt
 3. less
 命令格式:less [选项] [文件]
 常用选项及功能
 -N:显示行号。
 -S:当行过长时,截断显示,可通过左右箭头查看完整内容。
 -i:搜索时忽略大小写。
 示例
 查看文件并显示行号:less -N file.txt
 在less中搜索忽略大小写的内容:/search -i
 4. nl
 功能:为文件添加行号,类似cat -b。
 示例
 为文件添加行号:nl file.txt
 5. tac
 功能:逆序显示文件内容。
 示例
 逆序显示文件:tac file.txt
 6. rev
 功能:反转每行的字符顺序。
 示例
 反转每行字符:rev file.txt
 7. head
 命令格式:head [选项] [文件]
 常用选项及功能
 -n [行数]:显示文件开头的指定行数,若行数为负数,则从文件开头到倒数第|行数|行。
 -c [字节数]:显示文件开头的指定字节数。
 示例
 查看文件前 5 行:head -n 5 file.txt
 查看文件前 10 字节:head -c 10 file.txt
 8. tail
 命令格式:tail [选项] [文件]
 -n [行数]:显示文件末尾的指定行数,若行数为负数,则从第|行数|行到文件末尾。
 -c [字节数]:显示文件末尾的指定字节数。
 -f:实时跟踪文件末尾的新增内容,常用于日志监控。
 示例
 查看文件后 3 行:tail -n 3 file.txt
 实时跟踪日志文件:tail -f log.txt
 9. cut
 命令格式:cut [选项] [文件]
 常用选项及功能
 -d [分隔符]:指定分隔符,默认是制表符。
 -f [字段列表]:指定要提取的字段,如单个字段、多个离散字段或连续字段。
 -C:按字符切割。
 示例
 提取/etc/passwd文件中以:分隔的第 1、3 和 7 列:cut -d: -f1,3,7 /etc/passwd
 10. paste
 命令格式:paste [选项] [文件]
 常用选项及功能
 -d [分隔符]:指定分隔符,默认是制表符。
 -s:将文件的所有行合并为一行。
 示例
 合并两个文件同行号的列:paste -d ' ' file1.txt file2.txt
 将文件的所有行合并为一行:paste -s file.txt
 11. wc
 命令格式:wc [选项] [文件]
 常用选项及功能
 -l:统计行数。
 -w:统计单词数。
 -c:统计字节数。
 -m:统计字符数。
 -L:显示最长行的长度。
 示例
 统计文件的行数、单词数和字节数:wc -lwc file.txt
 12. sort
 命令格式:sort [选项] [文件]
 常用选项及功能
 -r:逆序排序。
 -n:按数字大小排序。
 -h:按人类可读的格式排序(如1K、2M等)。
 -f:忽略大小写。
 -u:去除重复行。
 示例
 对文件内容按数字大小排序:sort -n file.txt
 按人类可读格式排序:sort -h file.txt
 13. uniq
 命令格式:uniq [选项] [文件]
 常用选项及功能
 -c:在每行前显示该行重复出现的次数。
 -d:只显示重复的行。
 -u:只显示不重复的行。
 示例
 统计文件中重复行的次数:sort file.txt | uniq -c
 14. diff
 命令格式:diff [选项] [文件1] [文件2]
 常用选项及功能
 -u:以统一格式输出差异,便于查看和生成补丁文件。
 示例
 比较两个文件的差异:diff -u file1.txt file2.txt
 15. patch
 功能:将diff生成的补丁文件应用到原始文件。
 示例
 应用补丁文件:patch file1.txt patch_file
 二、文件查找工具
 1. find
 命令格式:find [路径] [选项] [表达式]
 常用选项及功能
 -name [文件名模式]:按文件名查找,支持通配符。
 -type [文件类型]:按文件类型查找,如f(文件)、d(目录)等。
 -size [大小条件]:按文件大小查找,如+10M(大于 10 兆)、-5k(小于 5 千字节)。
 -mtime [时间条件]:按文件修改时间查找,如+3(3 天前修改的)、-1(1 天内修改的)。
 -exec [命令] {} \;:对找到的文件执行指定命令。
 示例
 在/home/user目录下查找所有.txt文件:find /home/user -name '*.txt'
 查找/var/log目录下 3 天前修改的文件并删除:find /var/log -mtime +3 -exec rm {} \;
 2. locate
 命令格式:locate [选项] [模式]
 常用选项及功能
 -i:忽略大小写查找。
 -c:只显示匹配的文件数量。
 -r:使用正则表达式查找。
 示例
 查找包含python的文件(忽略大小写):locate -i python
 统计包含error的文件数量:locate -c error
 三、文本处理三剑客
 1. grep
 命令格式:grep [选项] [模式] [文件]
 常用选项及功能
 -i:忽略大小写匹配。
 -v:反向匹配,显示不包含模式的行。
 -r:递归搜索目录及其子目录。
 -n:显示匹配行的行号。
 -c:统计匹配的行数。
 -o:只显示匹配的字符串。
 -q:静默模式,不第个输入,类型为图片读到的内容是:
 -A [行数]:显示匹配行后指定行数的内容。
 -B [行数]:显示匹配行前指定行数的内容。
 -C [行数]:显示匹配行前后指定行数的内容。
 -e [模式1] -e [模式2]:匹配多个模式中的任意一个。
 -w:匹配整个单词。
 -E:使用扩展正则表达式。
 -F:不使用正则表达式,按字符串字面匹配。
 -P:支持 Perl 风格的正则表达式。
 -f [文件]:从文件中读取模式进行匹配。
 示例
 在文件中查找包含hello的行并显示匹配行后 2 行:grep -A 2 hello file.txt
 递归查找目录中包含error或warning的文件:grep -r -e error -e warning /home/user/docs
 2. sed
 命令格式:sed [选项] '命令' [文件]
 常用选项及功能
 -i:直接修改文件内容(谨慎使用),可指定备份后缀,如-i.bak。
 -e:在同一命令行执行多个命令。
 -n:只输出处理后的行。
 基本命令及功能
 s/旧字符串/新字符串/[修饰符]:替换操作,修饰符g表示全局替换,p显示替换行,w保存替换行到文件。
 d:删除行。
 p:打印行。
 a \新行内容:在指定行后添加新行。
 i \新行内容:在指定行前插入新行。
 c \新行内容:替换指定行内容。
 w [文件]:保存匹配行到文件。
 r [文件]:读取文件内容到指定位置。
 示例
 在文件中替换所有apple为banana并保存替换行到新文件:sed -i.bak 's/apple/banana/g' file.txt && sed -i.bak 'w new_file.txt' file.txt
 在指定行后添加新行:sed '3a new line' file.txt
 3. awk
 命令格式:awk [选项] '脚本' [文件]
 常用选项及功能
 -F [分隔符]:指定字段分隔符。
 -v [变量名]=[变量值]:定义变量。
 脚本编写示例
 打印文件中第二列:awk -F ',' '{print $2}' data.csv
 计算文件中数字的总和:awk '{sum += $1} END{print sum}' nums.txt
 根据条件处理行:awk '$1 > 10' log.txt
 四、文本格式化命令(printf)
 命令格式:printf '格式字符串' [参数列表]
 格式说明符
 % s:格式化字符串。
 % d:格式化整数。
 % f:格式化浮点数。
 % c:格式化单个字符。
 % e、% E:格式化科学计数法表示的浮点数。
 % o:格式化八进制数。
 % x、% X:格式化十六进制数。
 修饰符
 宽度指定:如 %5d(整数宽度为 5,右对齐),%-5d(左对齐)。
 精度指定:如 %5.2f(总宽度 5,小数 2 位)。
 示例
 格式化输出字符串和整数:printf "The number is %d and the string is %s\n" 10 "Hello"
 按指定宽度和精度输出浮点数:printf "The value is %7.3f\n" 3.14159
4. 总结文本处理的grep命令相关的基本正则和扩展正则表达式。
 
grep 命令相关的正则表达式
一、基本正则表达式
 字符匹配
 普通字符:直接匹配字符本身。例如,grep "hello" file.txt会匹配文件file.txt中包含hello的行。
 特殊字符
 .(点号):匹配任意单个字符。例如,grep "h.lp" file.txt会匹配help、h1lp等。
 [](字符类):匹配方括号内的任意一个字符。例如,grep "h[aeiou]lp" file.txt会匹配help、hulp等以h开头,lp结尾,中间是元音字母的字符串。
 [^](否定字符类):匹配不在方括号内的任意一个字符。例如,grep "h[^aeiou]lp" file.txt会匹配h1lp、hXlp等中间不是元音字母的字符串。
 重复匹配
 *(星号):匹配前面的字符零次或多次。例如,grep "a*b" file.txt会匹配b、ab、aab等。
 \{n\}:匹配前面的字符恰好n次。例如,grep "a\{3\}b" file.txt会匹配aaab。
 \{n,\}:匹配前面的字符至少n次。例如,grep "a\{2,\}b" file.txt会匹配aab、aaab等。
 \{n,m\}:匹配前面的字符至少n次且最多m次。例如,grep "a\{1,3\}b" file.txt会匹配ab、aab、aaab。
 位置匹配
 ^(脱字符):匹配行首。例如,grep "^hello" file.txt会匹配以hello开头的行。
 $(美元符号):匹配行尾。例如,grep "world$" file.txt会匹配以world结尾的行。
 二、扩展正则表达式(使用-E选项或egrep命令)
 字符匹配
 与基本正则表达式类似,但增加了一些便捷的字符类:
 [:alpha:]:匹配任意字母字符。
 [:digit:]:匹配任意数字字符。
 [:alnum:]:匹配任意字母或数字字符。
 [:space:]:匹配任意空白字符(空格、制表符等)。
 [:punct:]:匹配任意标点符号。
 重复匹配
 +(加号):匹配前面的字符一次或多次。例如,egrep "a+b" file.txt会匹配ab、aab等,但不匹配b(区别于*)。
 ?(问号):匹配前面的字符零次或一次。例如,egrep "a?b" file.txt会匹配b和ab。
 逻辑匹配
 |(竖线):表示逻辑或。例如,egrep "hello|world" file.txt会匹配包含hello或world的行。
 分组匹配
 ()(括号):用于分组。例如,egrep "(ab)+" file.txt会匹配ab、abab等。
5. sed将文件test中第50行中的helloworld改为nihao
 
sed -i '50s/helloworld/nihao/g' test 
7. 在每一行后增加一空行
测试文件为cp /etc/passwd ~/,不要直接修改passwd文件
 
sed -i 'G' passwd~
8.删除文件每行的第一个字符。
9.删除文件每行的第二个字符
10.删除文件每行的最后一个字符
11.删除文件每行的倒数第二个字符(有精力的同学第二个链接可以多练习)
 
sed 's/^.//' test #删除文件每行的第一个字符
sed -r 's/(.)(.)(.*)/\1\3/' test #删除文件每行的第二个字符
sed -r 's/(.*)(.$)/\1/' test #删除文件最后的第一个字符
sed -r 's/(.*)(.)(.$)/\1\3/' test #删除文件最后的第二个字符test文件


参考答案5-11:https://qxblog.top/%E9%A2%98%E7%9B%AE-%E6%96%87%E6%9C%AC%E4%B8%89%E5%89%91%E5%AE%A2%E5%92%8Cshell/
参考答案5-11:https://www.cnblogs.com/zll1217/articles/15394141.html
  
12. 总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。
变量命名规则主要包括命名要求与命名习惯:
命名要求
 大小写区分:在命名时严格区分大小写,不同大小写形式代表不同的命名。
 避免保留字和内置变量:不能使用像 “if”“for” 等程序中的保留字以及内置变量进行命名。
 字符使用限制:只能用数字、字母及下划线进行命名,且不能以数字开头,同时不支持短横线 “-”,命名还需与主机名有所不同。
命名习惯
 见名知义:使用能体现实际作用的英文单词命名,避免使用简写,例如不用 “ATM” 这种简略形式。
 大小写规范
 变量名大写:适用于特定的全局变量或重要变量。
 局部变量小写:局部变量采用小写命名。
 函数名小写:函数名以小写形式呈现。
 命名方式
 大驼峰命名法:如 “StudentFirstName”,由多个单词组成,每个单词首字母大写,其余小写,常用于类名等重要概念的命名。
 小驼峰命名法:像 “studentFirstName”,第一个单词首字母小写,后续单词首字母大写,其余小写,常见于变量和方法命名。
 下划线命名法:例如 “student_name”,使用下划线连接单词,在特定编程风格或语言中较为常用。
 不同类型的 Shell 变量及其使用方式:
一、环境变量
 定义与设置
 在大多数 Shell(如 bash)中,可以使用export命令来定义环境变量。例如,要定义一个名为MY_VAR的环境变量并赋值为hello,可以在命令行中输入:
      export MY_VAR = "hello"
 也可以在 Shell 配置文件(如~/.bashrc或~/.bash_profile)中定义环境变量,这样变量在每次登录时都会自动设置。
 使用目的
 环境变量用于在整个系统环境或者用户的 Shell 会话中传递信息。例如,PATH环境变量定义了系统查找可执行文件的路径,当你在命令行输入一个命令时,系统会根据PATH中的路径来查找对应的可执行文件。
 许多程序会读取特定的环境变量来获取配置信息。例如,JAVA_HOME环境变量通常被 Java 相关的程序用来确定 Java 安装的目录。
 访问方式
 在 Shell 脚本或命令行中,可以直接使用$符号加上环境变量名来访问环境变量的值。例如,要查看MY_VAR的值,可以使用echo $MY_VAR。
二、位置变量
 定义与性质
 位置变量是由 Shell 自动定义的特殊变量,用于接收命令行参数。在 Shell 脚本中,$1表示第一个参数,$2表示第二个参数,以此类推。$0表示脚本本身的名称。
 使用示例
 假设存在一个名为test.sh的脚本,内容如下:
      #!/bin/bash
      echo "The script name is: $0"
      echo "The first parameter is: $1"
      echo "The second parameter is: $2"
 如果在命令行中执行./test.sh arg1 arg2,那么$0的值为test.sh,$1的值为arg1,$2的值为arg2。
三、只读变量
 定义与设置
 使用readonly命令来定义只读变量。例如,
 readonly MY_READONLY_VAR = "fixed value"。
 一旦定义为只读变量,就不能再修改其值。
 使用场景
 当有一些值在脚本运行过程中不应该被修改时,可以将其定义为只读变量。例如,脚本中用于计算的常量或者一些配置信息中不允许改变的部分。
 注意事项
 如果试图修改只读变量的值,Shell 会报错。例如,在定义了readonly MY_READONLY_VAR = "value"之后,执行MY_READONLY_VAR="new value"会导致错误。
四、局部变量
 定义与范围
 在 Shell 脚本或函数内部定义的变量通常是局部变量。在 bash 中,可以使用local关键字在函数内部定义局部变量。例如:
       my_function() {
        local local_var = "local value";
        echo $local_var;
      }
 局部变量的作用范围仅限于定义它的函数内部。在函数外部无法访问该局部变量。
 使用意义
 局部变量有助于避免变量名冲突。当不同的函数可能使用相同的变量名来表示不同的含义时,使用局部变量可以确保每个函数内部的操作不会相互干扰。
五、状态变量
 特殊意义与常见类型
 在 Shell 脚本中,状态变量通常用于表示命令执行的结果状态。例如,$?是一个特殊的状态变量,它保存了最近一次执行的命令的退出状态码。退出状态码为 0 表示命令执行成功,非 0 表示命令执行失败。
 使用示例
 执行一个命令,然后检查其状态:
      ls /nonexistent_directory
      echo "The exit status of the 'ls' command is: $?"
 可以根据$?的值在脚本中进行不同的操作,例如判断一个命令是否成功执行,如果失败则执行一些错误处理操作。
13. 通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?
#!/bin/bash
HEAD=$1
FOOT=$2
RABBIT=$[$[FOOT-2*HEAD]/2]
CHOOK=$[HEAD-RABBIT]
echo RABBIT:$RABBIT
echo CHOOK:$CHOOK
chook_rabbit.sh shell文件
 

14. 结合编程的for循环,条件测试,条件组合,完成批量创建100个用户,
1)for遍历1..100
 2)先id判断是否存在
 3)用户存在则说明存在,用户不存在则添加用户并说明已添加。
 
#! /bin/bash
for i in {1..100};doid user$i >/dev/null && echo user$i is exist ||{useradd user$i;PASS=`cat /dev/urandom | tr -dc '[:alnum:]' |head -c12`;echo $PASS | passwd --stdin user$i &> /dev/null;echo user$i:$PASS >> /root/user.log;echo "user$i is created";}
done
user_add.sh shell文件



相关文章:
 
运维云计算SRE-第2周
1. 总结学过的权限,属性及ACL相关命令及选项,示例。 一、Linux安全模型 (一)资源分派 Authentication(认证):验证用户身份,确保登录系统的用户是合法的。 Authorization(…...
React Native 全栈开发实战班 - 用户界面进阶之响应式设计实践
在移动应用开发中,响应式设计 是确保应用在不同设备、屏幕尺寸和方向下都能提供良好用户体验的关键。React Native 提供了多种工具和技巧来实现响应式设计,包括 Flexbox 布局、动态样式、屏幕尺寸适配等。本章节将详细介绍如何在 React Native 中进行响应…...
 
SlickGrid点击/双击事件
分析 SlickGrid提供了点击事件方法grid.onClick和grid.onDblClick用于捕获用户对表格列的点击,捕获到点击事件之后,修改表格数据,然后使用grid.updateRow方法将修改后的数据更新到表格中。 展示 代码 创建grid(HTML)…...
 
一文详细深入总结服务器选型
1. 题记: 服务器选型工作是项目规划检讨的一项非常重要的工作,本文详细深入总结服务器选型。 2. 服务器基础知识概览 2.1 服务器的定义与功能 2.1 .1 定义 服务器是一种高性能计算机,其设计目的是在网络中提供服务。它可以处理来自多个客…...
一、Nginx反向代理(七层代理)二、Nginx的TCP/UDP调度器(四层代理)
一、Nginx反向代理(七层代理) 实验要求 使用Nginx实现Web反向代理功能,实现如下功能: 后端Web服务器两台,可以使用httpd实现Nginx采用轮询的方式调用后端Web服务器两台Web服务器的权重要求设置为不同的值最大失败次数为…...
 
CSS+JQuery 实现弹力球效果,碰到屏幕边框弹回
实现弹力球效果,碰到屏幕边框弹回,效果如下 代码如下: <img src"../image/ball.png" alt"" class"ball"> <style>.ball {position: fixed;top: 50vh;left: 50vw;width: 15vw;height: 15vw;border…...
shell编程规范和脚本变量
什么是shell 人和计算机内核之间的中介: 计算机的语言是二进制,把人类的语言翻译成计算机能够识别的语言,然后让内核来处理 内核完成之后要把结果反馈给用户,要把计算机的翻译成人类能够识别的语言 命令解释器,pyc…...
 
jspm美容院管理系统
摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计…...
 
Prometheus结合K8s(二)使用
上一篇介绍了如何搭建 Prometheus结合K8s(一)搭建-CSDN博客,这章介绍使用 页面访问 kubectl get svc -n prom 看promeheus和granfana的端口访问页面 Prometheus 点击status—target,可以看到metrics的数据来源,即各…...
【虚幻引擎】UE5数字人开发实战教程
本套课程将会交大家如何去开发属于自己的数字人,包含大模型接入,流式输出,语音识别,语音合成,口型驱动,动画蓝图,语音唤醒等功能。 课程介绍视频如下: 【虚幻引擎】UE5 历时一个多月…...
深入分析:固定参考框架在RViz中的作用与对数据可视化的影响 ros ubuntu20.04
深入分析:固定参考框架在RViz中的作用与对数据可视化的影响 RViz (Robot Visualization) 是 ROS (Robot Operating System) 中一种重要的三维可视化工具,主要用于实时观察和分析传感器数据、机器人状态信息以及环境模型。RViz的核心功能之一是固定参考框…...
 
Android:时间选择器(最下面有效果图)
1.创建DateUtil类 /*** Created by wangshuai on 2024/11/19.*/ public class DateUtil {public final static String PATTERN_ALL"yyyy-MM-dd HH:mm:ss";public final static String PATTERN_DEFAULT"yyyy-MM-dd";/*** 获取当前时间* return yyyy-MM-dd*…...
第十六届蓝桥杯模拟赛(第一期)-c++/c
c/c蓝桥杯模拟赛题解,非常详细 质因数 1、填空题 【问题描述】 如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提…...
如何挑选路由器?需要看哪些参数?
挑选路由器时,选择合适的型号和参数对于确保家庭或办公网络的速度、稳定性和覆盖范围至关重要。以下是挑选路由器时需要考虑的关键参数和因素: 1. 无线标准 (Wi-Fi标准) 无线标准是衡量路由器性能的核心指标。不同的无线标准提供不同的速率、范围和技术…...
 
mysql-备份(二)
前章介绍了MySQL的内部数据结构btree,这章讲述mysql的备份 1:环境 ubuntu22.04 LST mysql5.7.42 or win10 mysql5.7.44 (这里图简单直接windows部署) download:https://downloads.mysql.com/archives/community/ 2:install 1> unzip mysql-5.7.44-w…...
Tailwind CSS 和 UnoCSS简单比较
UnoCSS 和 Tailwind CSS 都是流行的原子化 CSS 框架,但它们在设计理念、性能和使用方式上有一些重要的区别。下面是对它们的详细对比: 1. 概述 Tailwind CSS:Tailwind 是一个原子化的 CSS 框架,提供了大量的预定义类(…...
unity3d————范围检测
目录 知识点一:什么是范围检测 知识点二:如何进行范围检测 问题: Physics.queriesHitTriggers 怎么查看是不是true? QueryTriggerInteraction.UseGlobal 参数意味着是否检测触发器将依据全局设置 Physics.queriesHitTrigge…...
 
修改this.$confirm的按钮位置、图标、文字及标题
在Vue.js项目中,this.$confirm 通常是基于某些UI库(如Element UI或Ant Design Vue)的对话框确认方法。 以下是基于Element UI的this.$confirm的用法示例。 在此之前,你的项目要已经安装了Element UI,如果没安装话就打…...
SQL MID() 函数详解
SQL MID() 函数详解 SQL 中的 MID() 函数是一个非常有用的字符串处理工具,它允许用户从字符串中提取特定位置的子字符串。这个函数在数据库查询和报告中特别有用,尤其是在需要从较长的文本字段中提取特定信息时。本文将详细介绍 MID() 函数的用法、参数…...
 
【蓝桥杯备赛】123(前缀和的复杂应用)
5. 前缀和的复杂应用 5.1. 123(4 星) 5.1.1. 题目解析 这道题仍然是求一段区间的和,很容易能够想到前缀和找规律: 1------------------1 号块 1 2----------------2 号块 1 2 3--------------3 号块 1 2 3 4------------4 号…...
 
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
 
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
 
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
 
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
 
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
 
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
 
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
