Linux云盘算SRE-第二周
1. 总结学过的权限,属性及ACL相关命令及选项,示例。一、Linux安全模型
1、资源分派
Authentication(认证):验证用户身份,确保登录系统的用户是合法的。
Authorization(授权):根据用户身份设置不同的权限,决定用户可以对系统资源进行哪些操作。
Accouting(审计):记任命户的举动,用于事后审查,比方通过查看登录日记来了解用户的登录环境。 在Linux系统中,当用户登录乐成时,系统会自动分配令牌 token,包括:用户标识和构成员等信息。
2、3A认证
又称AAA认证,是一套针对网络设备的网络访问控制计谋安全模型。
3、安全上下文
运行中的程序(进程)以进程发起者的身份运行,其访问资源的权限取决于发起者的身份。只有具有相应权限的用户才气执行程序,并且程序在访问文件等资源时,其权限也由发起者的身份决定。二、用户和组相关概念
1、用户
Linux系统是多用户系统,可以同时存在多个用户,每个用户之间都是互相隔离的。在Linux系统中,每个用户是通过User Id (UID)来唯一标识的。用户范例有:
超等管理员:root用户,UID为0,拥有最高权限,可以对系统进行任何操作。
系统用户:CentOS 6以前为1 - 499,CentOS 7以后为1 - 999,这些用户重要用于给配景程序利用,如nginx、mysql等守卫进程。
登任命户:CentOS 6以前为500+,CentOS 7以后为1000+,用于用户进行交互式登录。
2、用户组 Linux 中可以将一个或多个用户参加用户组中,组就是包含 0 个或多个用户的聚集,用户组是通过 Group ID( GID ) 来唯一标识的。用户组范例有: 超等管理员组:root组,GID为0,供超等管理员利用。
系统组:CentOS 6以前为1 - 499,CentOS 7以后为1 - 999,用于守卫进程获取资源权限分配。
普通组:CentOS 6以前为500+,CentOS 7以后为1000+,供普通登任命户利用。
3、用户和组的关系
一个用户至少有一个组,此中有一个主组(primary group),创建用户时默认会创建与其同名的组作为主组,用户也可以属于0个或多个附加组(supplementary group)。利用组,可以对用户进行批量管理,比如对一个组授权,则该组下全部的用户能能继承这个组的权限。三、用户和组相关配置文件
1、重要配置文件
/etc/passwd:存储用户及其属性信息,包括登任命户名、密码占位符、UID、所属组ID、用户全名或表明、用户家目次以及用户默认shell等。
/etc/shadow:存储用户密码及其相关属性,如加密后的密码、上次修改密码的时间、密码有效期等信息,只有root用户有读权限。
/etc/group:存储组及其属性信息,包括组名、组密码占位符、组ID以及构成员列表等。
/etc/gshadow:存储组密码及其相关属性,如加密后的组密码、组管理员以及构成员列表等。
2、文件操作
可以利用专用工具来修改这些文件,如vipw和vigr用于编辑相关文件,pwck和grpck用于检查用户和组相关配置文件的精确性。也可以利用getent命令根据用户名查看配置项。四、用户和组管理命令
1、用户管理命令
useradd
用于创建新的Linux用户,可以指定多种选项,如UID、用户组、家目次、shell、是否创建系统用户、是否创建家目次、设置密码、指定附加组等。
usermod
用于修改用户属性,包括修改表明、家目次、过期日期、密码过期后的处理方式、组、附加组、登录名称、锁定或解锁用户帐号、修改密码、修改shell、修改UID等。
userdel
用于删除Linux用户,可以选择是否强制删除以及是否删除家目次和邮件目次。
id
用于查看用户的UID、GID等信息,可以表现详细信息,也可以只表现特定的信息,如主组ID、附加组ID、用户名或组名等。
su
用于切换用户身份,可以进行登录式切换(读取目的用户的配置文件,切换至目的用户的家目次)和非登录式切换(不读取目的用户的配置文件,不改变当前工作目次),还可以在不切换用户的环境下,利用目的用户的权限和环境执行命令。
passwd
用于修改用户密码,可以进行多种操作,如锁定、解锁、删除密码、设置密码有效期、提醒用户密码过期等,普通用户修改自己密码需要先验证当前利用的密码。
chage
用于修改用户密码计谋,包括更改密码的时间、设置密码最短有效期、最长有效期、警告期、密码过期后的宽限期以及用户的有效期等,还可以查看用户的密码计谋。
2、组管理命令
groupadd
用于创建组,可以指定组ID、是否为系统组、是否允许重复GID、设置组密码等。
groupmod
用于修改组属性,如修改组ID、组名以及组密码等。
groupdel
用于删除组,强制删除可能导致无主组的用户不可用无法登录。
gpasswd
用于更改组密码,也可以修改附加组的成员关系,在组没有密码的环境下,加组操作只能由root用户进行。
groupmems
用于管理附加组的成员关系,可以添加、删除成员,查看成员列表,扫除全部成员等,只有root用户可以更改指定组的成员关系。五、文件权限管理
1、权限体系介绍
角色
属主(owner):文件的全部者,通常是创建文件的用户。
属组(group):文件所属的组,用户可以属于多个组,文件所属组决定了组内用户对文件的权限。
其它用户(other):不属于属主和属组的用户。
权限
读(r,4):对文件来说,可查看文件内容;对目次来说,可读取目次中的文件名,但无法查看文件元数据。
写(w,2):对文件来说,可修改文件内容;对目次来说,可在目次中创建文件和删除文件。
执行(x,1):对文件来说,可执行文件,发起一个进程;对目次来说,可进入目次,可查看文件元数据,可查看文件内容。
2、文件全部者和属组属性操作命令
chown
用于修改文件的属主和属组,可以只修改全部者、只修改属组或同时修改全部者和属组,还可以根据原属主属组进行修改,支持递归操作以及多种选项,如表现过程、不表现错误信息等。
chgrp
用于只修改文件的属组,支持雷同chown的多种选项和操作方式,如递归修改、根据文件修改等。
3、文件权限操作命令
chmod
用于修改文件权限,可以利用字符表现法(如u+r表现属主加读权限)或八进制数字表现法(如644表现属主可读写,属组可读,其它用户可读),支持递归操作以及多种选项,如表现过程、不表现错误信息等。
4、新建文件和目次的默认权限
新建文件的默认权限为666 - umask,新建目次的默认权限为777 - umask。umask值间接影响新建文件和目次的权限,非特权用户umask默认是002,root的umask默认是022,可以通过umask命令查看和修改umask值,并且可以在全局设置文件(如/etc/bashrc、/etc/bash.bashrc或~/.bashrc)中长期保存umask设置。
5、特殊权限
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。
6、访问控制列表ACL
ACL权限功能
提供更细粒度的权限控制,可以单独对指定的用户设定各不雷同的权限,弥补了rwx权限体系只能将用户分成三种角色的不足。CentOS7默认创建的xfs和ext4文件系统具有ACL功能,CentOS7之前版本需要手动增加。
ACL相关命令
setfacl:用于设置ACL权限,可以修改、删除ACL权限,设置默认ACL,递归执行等操作。
getfacl:用于查看设置的ACL权限。 #linux用户管理相关命令汇总
vipw|vigrg|--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 -ausername#显示详细信息,默认选项
id -Z|--context username #仅显示安全上下文信息,要开启selinux 配置才有
id -g|--groupusername #仅显示GID,就是只显示主组ID
id -G|--groupsusername #显示主组和附加组ID,就是所有组ID
id -n|--name username#显示用户名或组名,要组合使用 -nu|-ng|-nG
id -u|--user username #仅显示UID
su -m|-p|--preserve-environment username #不重置环境变量
su -g|--group groupusername #指定主组,只有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 shellusername #切换用户后,指定 /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_DIRusername #指定家目录,可以是不存在的,指定家目录,并不代表创建
useradd s|--shell SHELL username #指定 shell,可用shell在/etc/shells 中可以查看
useradd -r|--systemusername #创建系统用户,CentOS 6之前 ID<500,CentOS7 以后
useradd-m|--create-homeusername #创建家目录,一般用于登录用户
useradd-M|--no-create-homeusername #不创建家目录,一般用于不用登录的用户
useradd -p|--password PASSWORDusername#设置密码,这里的密码是以明文的形式存在
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 INACTIVEusername #密码过期之后,账户被彻底禁用之前的天数
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 INACTIVEusername #密码过期之后,账户被彻底禁用之前的天数
usermod -g|--gid GROUP username#修改组
usermod -G|--groups GROUPSusername# 新附加组,原来的附加组将会被覆盖;若保留同时使用-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-uniqueusername #允许使用重复的(非唯一的) 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|--forceusername#强制删除,哪怕用户正在登录状态
userdel -r|--removeusername #删除家目录和邮件目录
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=DAYSusername #指定用户密码最长有效期,仅root有权限操作
passwd -n|--minimum=DAYS username #指定用户密码最短有效期,仅root有权限操作
passwd -w|--warning=DAYSusername #在密码过期前多少天开始提醒用户,仅root有权限操作
passwd -i|--inactive=DAYS username#当密码过期后少天该用户账号会被禁用,仅root有权限操作
passwd -S|--status username #查询用户的密码状态,仅root有权限操作
passwd --stdin username #从标准输入接收密码,Ubuntu无此选项
chage -d LAST_DAYusername#更改密码的时间
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,默认系统分配,指定值不要超过
groupadd -K|--key KEY=VALUE groupname #不使用 /etc/login.defs 中的默认值,自己指定,
groupadd -o|--non-unique groupname #允许创建有重复 GID 的组
groupadd -p|--password PASSWORDgroupname#为新组使用此加密过的密码
groupadd -r|--system groupname#创建一个系统组 CentOS 6之前
groupmod -g|--gid GID groupname #将组 ID 改为 GID
groupmod -n|--new-name NEW_GROUPgroupname #改名为 NEW_GROUP
groupmod -o|--non-unique groupname #允许使用重复的 GID
groupmod -p|--password PASSWORDgroupname #将密码更改为(加密过的) PASSWORD
groupdel -f|--forcegroupname#强制删除
gpasswd-a|--add usernamegroupname#向组中添加用户
gpasswd-d|--delete usernamegroupname#从组中移除用户
gpasswd-r|--delete-passwordgroupname#删除组密码
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#显示组成员列表https://i-blog.csdnimg.cn/direct/09e63abece514db9badca00b7401486a.png
https://i-blog.csdnimg.cn/direct/57f9ddaf294645568f08cb73111c0a54.png
https://i-blog.csdnimg.cn/direct/2230ba0a62c541b7a5a6a5d9d9782d0b.png
#linux用户权限常用命令汇总
chown -c|--changesfilename#同-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|--quietfilename#不显示错误信息
chgrp -v|--verbose filename #显示过程
chgrp --dereference filename #修改的是符号链接指向的文件,而不是链接文件本身
chgrp -h|--no-dereferencefilename#修改的是符号链接文件,而不是其指向的目标文件
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|--quietfilename#不显示错误信息
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 #以字符显示
umasku=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 -Rfilename #递归执行
chattr -V filename#显示过程,并输出chattr 版本
chattr -ffilename #不输出错误信息
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=filefilename#从文件读取新规则
setfacl --mask filename #重新计算mask值
setfacl -n|--no-mask filename #不重新计算mask值
setfacl -d|--default filename#在目录上设置默认acl
setfacl -R|--recursivefilename #递归执行
setfacl -L|--logical filename #将acl 应用在软链接指向的目标文件上,与-R一起使用
setfacl -P|--physical filename #将acl 不应用在软链接指向的目标文件上,与-R一起使用
setfacl -m mask::rx filename #mask权限
getfacl filename #查看权限列表
https://i-blog.csdnimg.cn/direct/e60eff15dbe2417d950b23406093c8bc.png
https://i-blog.csdnimg.cn/direct/c2dcd8384eeb4889bc06d9e78018db8f.png
https://i-blog.csdnimg.cn/direct/09cdedd1cd444ebfb134a551403d6c40.png
2. 联合vim几种模式,学会利用vim几个常见操作。
打开文件:
在终端中输入vim 文件名即可打开指定文件。比方,如果要打开名为test.txt的文件,可以输入vim test.txt。此时进入命令模式。
退出文件:
1)命令模式->命令扩展模式 退出
如果没有对文件进行任何修改,先输入: 进入命令扩展模式,再输入q就可以退出文件。
如果对文件进行了修改但不想保存,先输入:进入命令扩展模式,再输入q!强制退出(会放弃全部修改)。
如果对文件进行了修改并且想要保存后退出,先输入:进入命令扩展模式,在输入wq(先保存再退出)。
2)命令模式 退出
输入ZZ保存修改就可以退出文件。
输入ZQ不保存修改就可以退出文件。
从命令模式进入插入模式:
在命令模式下,可以利用以下按键进入插入模式:
i:在光标当前位置插入。
a:在光标当前位置的下一个字符处插入。
o:在光标地点行的下一行插入新的一行并进入插入模式。
I:在光标地点行的行首插入。
A:在光标地点行的行尾插入。
从插入模式回到命令模式:
在插入模式下,按下Esc键即可回到命令模式。
完成特定内容编写后的操作(包含插入、返回命令模式和退出)
按照要求,在打开文件(命令模式)后进入插入模式(如按i),输入 “马哥出品,必属佳构”。
然后按Esc键回到命令模式。
若要保存并退出,可以输入:wq;若不想保存并退出,输入:q!;若只是想保存不退出,输入:w。
在完成上述文件的编辑并保存退出后,可以利用cat命令来查看文件内容。
如果编辑的文件名为test.txt,在终端输入cat test.txt,就可以看到文件中的内容是否为刚刚自己编写的 “马哥出品,必属佳构”。
扩展命令模式根本命令
w:写(存)磁盘文件
wq:写入并退出
x:写入并退出
X:加密
q:退出
q!:不存盘退出,纵然更改都将丢失
r filename :读文件内容到当前文件中
w filename :将当前文件内容写入另一个文件
!command :执行命令
r!command :读入命令的输出
命令模式快捷键:
输入ZZ保存修改就可以退出文件。
输入ZQ不保存修改就可以退出文件。
光标跳转
在单词间跳转:
w:将光标移至下一个单词的开头。
b:将光标移至上一个单词的开头。
e:将光标移至当前单词的末尾。
在句子间跳转:
):将光标移至下一个句子的开头。
(:将光标移至上一个句子的开头。
上下跳转:
j:光标向下移动一行。
k:光标向上移动一行。
行复制粘贴
复制行:在命令模式下,将光标移至要复制的行,按yy(复制当前行),若要复制多行,可以利用数字yy(比方3yy表现复制从当前行开始的 3 行)。
粘贴行:将光标移至要粘贴的位置,按p(粘贴在光标地点行的下一行)大概P(粘贴在光标地点行的上一行)。
行删除
在命令模式下,将光标移至要删除的行,按dd即可删除当前行。若要删除多行,可以利用数字dd(比方3dd表现删除从当前行开始的 3 行)
3. 总结学过的文本处理工具,文件查找工具,文本处理三剑客, 文本格式化命令(printf)的相关命令及选项,示例。
1、文本处理工具
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
2、文件查找工具
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
3、文本处理三剑客
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
4、文本格式化命令(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 命令相关的正则表达式
1、根本正则表达式
字符匹配
普通字符:直接匹配字符本身。比方,grep "hello" file.txt会匹配文件file.txt中包含hello的行。
特殊字符
.(点号):匹配恣意单个字符。比方,grep "h.lp" file.txt会匹配help、h1lp等。
[](字符类):匹配方括号内的恣意一个字符。比方,grep "hlp" 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末端的行。
2、扩展正则表达式(利用-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 https://i-blog.csdnimg.cn/direct/4d309409d04a4f508086b7f931075d48.png
6. 在每一行后增加一空行
测试文件为cp /etc/passwd ~/,不要直接修改passwd文件
sed -i 'G' passwd~ https://i-blog.csdnimg.cn/direct/aeee8b82de814fde836352322d476e70.png
https://i-blog.csdnimg.cn/direct/95b92c73fbf5454680becfc63f0bf36e.png
https://i-blog.csdnimg.cn/direct/8ded7cc41c644a31a0607e960480e17f.png
7.删除文件每行的第一个字符
8.删除文件每行的第二个字符
9.删除文件每行的最后一个字符
10.删除文件每行的倒数第二个字符
sed 's/^.//' test #删除文件每行的第一个字符
sed -r 's/(.)(.)(.*)/\1\3/' test #删除文件每行的第二个字符
sed -r 's/(.*)(.$)/\1/' test #删除文件最后的第一个字符
sed -r 's/(.*)(.)(.$)/\1\3/' test #删除文件最后的第二个字符 https://i-blog.csdnimg.cn/direct/b7707ce5a7304b0a960b0926846258bc.png
https://i-blog.csdnimg.cn/direct/c4679445746e4c2194ff93198cc03985.png https://i-blog.csdnimg.cn/direct/5868bc62b18240ab9ee82696045a7459.png
https://i-blog.csdnimg.cn/direct/3354e46ab3fe4f2cb8a21e6833502e50.png https://i-blog.csdnimg.cn/direct/dca088c8bbf7429199ec0f9ce062b3ab.png
11. 总结变量命名规则,不同范例变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何利用。
变量命名规则重要包括命名要求与命名习惯
命名要求
大小写区分:在命名时严格区分大小写,不同大小写情势代表不同的命名。
避免保存字和内置变量:不能利用像 “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: $?"
可以根据$?的值在脚本中进行不同的操作,比方判断一个命令是否乐成执行,如果失败则执行一些错误处理操作。
12. 通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?
#!/bin/bash
HEAD=$1
FOOT=$2
RABBIT=$[$/2]
CHOOK=$
echo RABBIT:$RABBIT
echo CHOOK:$CHOOK https://i-blog.csdnimg.cn/direct/f4c7501edd25424ba50edfaff35d58c0.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]