[linux学习笔记]兄弟连linux视屏教程(老师:沈超 李明)
发现自己的linux水平楞个瓜皮,找个视屏教程学习一哈。
1 linux系统简介
1.1 unix和linux发展史
unix发展历史:1969年,美国贝尔实验室的肯.汤普森开发出unix系统,1971年丹尼斯·里奇发明c语言,1973年,unix用c重写
硬件平台的概念 也就是cpu架构
powerpc ibm aix
pa-risc hp hp-ux
sparc sun solaris
ia(intel、amd、cyrix、rise...) red hat linux、ubuntu... linux
aix和hp-ux是不能安装在pc中,必须在特定的服务器上,solaris可以
freebsd 加州大学伯克利分校
mac也是由unix演变来的
linux发展历史:1991年,linus torvalds和其他众多爱好者开发完成
linux是开源软件,源码开放的unix
内核官网:www.kernel.org
版本号如 2.6.18
目前最新 4.18.4
次版本是偶数是稳定版奇数是开发版,这种说法在主版本更新到3就没了
发行版:redhat系列(yum)和debian系列(apt-get)
fedora是rhel的实验版本,要收费
centos完全免费 社区维护
gentoo linux不适合初学者
suse在欧洲用的多,界面都快赶上unbuntu
knoppix不用安装,类似livecd
ubuntu界面漂亮,桌面用户多点,server端并不多
1.2 开源软件简介
商业软件是收费的
开源软件免费但是可以收服务费
使用、研究、散布及改良的自有
1.3 linux应用领域
基于linux的企业服务器
www.netcraft.com 扫描和踩点网站
嵌入式应用
安卓、手机、平板、智能家电、航空、银行、卡拉ok点歌系统、树莓派
1.4 学习方法
善用工具
英文
忘掉windows思维方式
2 linux系统安装
磁盘分区
分区类型
主分区:最多4个
扩展分区:最多1个,不能写入数据,只能挂载逻辑分区
主分区+扩展分区 最多4个
逻辑分区
格式化(高级格式化)又称为逻辑格式化,是要在硬盘中写入文件系统
ext4 4k 数据块 block
i节点 inode列表
低级格式化是硬盘操作不是操作系统操作
硬件设备文件名:
ide硬盘 hd[a-d]
scsi/sata/usb硬盘 sd[a-p]
光驱 cdrom或sr0
鼠标 mouse
打印机(25针) lp[0-2]
打印机(usb) /dev/usb/lp[0-15]
ide 133mb 最古老, scsi都淘汰了 200mb贵服务器
sata3 串口硬盘 500mb/s 现在一般都是这个
逻辑分区不能占用1 2 3 4编号 5一定是第一个逻辑分区
挂载:
/ 根分区
swap分区 交换分区 内存1.5-2倍 不超过2g
推荐分区/boot 启动分区 200m即可 太大无用,系统启动都要有空闲空间,防止系统写满导致无法启动,写完之后永远不会往这个分区再写入数据,他永远有空闲空间 boot分区一定是sda1第一个分区
挂载点必须是空目录
安装日志:
/root/install.log:存储了安装在系统中的软件包及其版本信息
/root/install.log.syslog 存储安装过程中留下的事件记录
/root/anaconda-ks.cfg 已kickstart配置文件的格式记录安装过程的选项设置 作为无人值守安装的模板
linux 严格区分大小写
命令全是小写
文件名区分大小写
tab键自动补全
linux中一切皆文件 设备文件是特殊的文件
永久生效都要写入文件 写入内存的都是临时生效
linux不通过扩展名区分文件类型
linux存储设备都必须挂载后才能使用
目录作用
/bin 存放系统命令,普通用户和root都可以执行
/sbin 保存和系统环境设置相关的命令,只有root能执行
/usr/bin
/usr/sbin
/boot 系统启动目录
/dev 设备文件
/etc 配置文件
/home 宿主目录
/lib 系统函数库
/lost+found/ 当系统崩溃或意外关机而产生的文件碎片。当系统启动过程fsck工具会检查这里,并修复系统 每个分区都有自己的这个目录
/media 挂载目录 多媒体设备 光盘
/mnt 挂载目录 u盘移动硬盘或其他操作系统分区
/misc 挂载目录 系统建议用来挂载nfs服务的共享目录
/opt 第三方软件保存位置 用处不多,现在外部软件一般放/usr/local目录
/proc 虚拟文件系统 放内存中 当前系统的进程和硬件信息
/sys 虚拟文件系统 放内存中 存放内核相关信息
/root root家目录
/srv 服务数据目录
/tmp 临时
/usr 系统软件资源目录
/var 动态数据保存位置。保存缓存、日志及软件运行产生的文件
usr unix system resource
服务器不允许关机,只能重启
重启时应该关闭服务
不要在服务器访问高峰运行高负载命令
远程配置防火墙时不要把自己踢出服务器
合理分配权限
定期备份重要数据和日志
3 常用命令
3.1 文件处理命令
命令格式 命令 [-选项] [参数] ls -al /etc 中括号表示可选
个别命令不遵守此格式 多个选项可以写一起 简化选项和完整选项 -a --all
目录处理命令:
ls list /bin/ls -aldh
所有者 所属组 其他人 ugo rwx 读写执行权限 777 软链接 硬链接
-表示文件 d表示文件 l表示link
.开头的文件表示隐藏文件 .当前目录 ..父目录
mkdir /bin 创建目录 -p 表示递归创建 -m=mode 可以同时创建多个目录 空格分割
cd 切换目录 change directory shell内置命令
pwd /bin 显示当前目录
rmdir remove empty directories /bin 删除空目录
cp copy /bin -rp r表示递归 p保留文件属性 可以复制多个文件
mv move /bin 剪切、改名 可以剪切多个
clear ctl+l 清屏
rm 删除文件 remove /bin -rf f表示强制执行
文件处理命令:
touch /bin 创建空文件 文件名如果是有空格 加双引号 不建议
cat 查看文件 /bin -n 显示行号
tac 导致显示
more 分页显示文件内容 /bin 空格或f 翻页 q或q退出 enter换行
less 同more不过可以向上翻页 pageup 上箭头 还可以搜索 /词儿 高亮显示搜索到的 n显示下个搜索到的
head 查看前几行 -n 默认10行
tail -fn 查看后几行 -f实时监控
链接命令:
ln link /bin ln -s [原文件] [目标文件] -s表示软连接 不加表示硬链接
软连接类似win快捷方式,l标记权限全是777 软连接很小
硬链接和原文件的i节点相同
硬链接删除源文件,目标文件依然可以使用。软链接一旦删除源文件,目标文件不可用
和cp -p的不同处 修改一处后,另外一处也会同时更新。
硬链接不能跨分区 硬链接不能对目录使用
3.2 权限管理命令
chmod root和所有者可以改权限
change the permissions mode of a file
/bin
-r 递归修改 mode=421 {ugoa}+-={rwx}
可以同时进行多个授权
更多的是用数字方式 777 表示拥有全部权限
对目录 r表示可以列出目录内容 w表示可以在目录中创建 删除文件 x可以进入目录
删除文件的权限是对所在目录有写权限
对目录有r权限就一般有x权限
chown 只有root可以改
change file ownership
chgrp
useradd
groupadd
一般谁创建的文件 谁就是所有者
一个用户有多个组 单有个缺省组 文件的创建者的缺省组就是文件的所属组
umask -s 缺省权限 u=rwx,g=rx,o=rx
创建目录的权限和缺省权限一样
创建文件的权限是缺省权限去除x权限 防木马病毒
umask 0022 0 特殊权限 022 真正的权限是777-022=755
umask 023
3.3 文件搜索命令
find 搜索会占用大量资源 不要在服务高峰期使用 window中everything挺好用的,不过没有linux版本,并且只支持ntfs分区
/bin find [搜索范围] [匹配条件]
-name 根据文件名搜索 find /etc -name init
通配符 *匹配任意字符 ?匹配单个字符
-iname 忽略大小写
搜索范围越小越好 能不在根目录下就不要全局搜索 严重耗费资源
-size 指定文件大小 +- linux一个数据块512b 就是0.5k 查找大于100m的文件find / -size +204800
-user 找所有者的文件
-group 找所属组的文件
根据时间属性查找
-amin 访问时间 access
-cmin 文件属性 change
-mmin 文件内容 modify
find /etc -cmin -50 查找50分钟以内修改过文件属性的文件 +-
连接选项 -a两个条件同时满足 -o两个条件满足任一 find / -size +163840 -a -size -204800
find /etc -name init -exec ls -l {} \; -exec/-ok 命令 {} \; 对搜索结果执行操作 -ok有确认询问
-type 根据文件类型 f文件 d目录 l软连接
-inum 根据i节点查找 可以找硬链接
locate命令
/usr/bin 在文件资料库中查找
yum install -y mlocate
会定期更新
速度快
updatedb 初始化
locate -i 不区分大小写
/tmp目录不被收录 某些目录不被收录
which 命令搜索 which ls 还能搜到命令别名
whereis 还能搜到帮助文件
grep -i 不区分大小写 -v排除指定字符串 ^表示行首 反向查找 屏蔽
3.4 帮助命令
man manual /usr/bin
可以查命令帮助 也可以查配置的帮住
man ls
man services 不可以写绝对路径
可以 /内容 查找
man passwd 优先查命令 1一般是命令的帮住 5一般是配置文件的帮住
man 5 passwd 是查配置
whatis 可以查到命令的简短介绍 就是帮助文档的name部分
apropos 可以查配置文件的简短介绍 也不要加绝对路径
--help 只看选项 不会man那么长
info 和man大同小异
help 可以查看shell内置命令的帮助
shell内置命令找不到路径
3.5 用户管理命令
useradd 加用户
passwd 改密码 普通用户改自己密码需要满足复杂度要求
who 查看哪些用户登录 tty表示本地登录 pts表示远程终端
w 查看登录用户及正在干嘛
3.6 压缩解压命令
绝大多数病毒很难感染压缩文件
常用压缩格式
.gz linux中常用格式 命令gzip gunzip解压缩 或者gzip -d
压缩比很惊人 差不多5倍
不过gzip只能压缩文件 不能目录
压缩解压均不保留源文件
.zip linux和win通用格式
zip命令 保留源文件 -r压缩目录
压缩比差于gzip
unzip解压缩 不区分文件和目录
.tar .tar.gz可以压缩目录
tar命令 -z 打包同时压缩格式为gz -c打包 -v verbose详细 -f 指定文件名 -x解包 -j打包同时压缩格式为bz2
.bz2 gzip的升级版
bzip2命令 -k可以保留原文件 压缩比惊人
bunzip2 解压缩.bz2文件 -k可以保留源文件 bzip2 -d也可以解压
tar -xjf 可以解压.tar.bz2文件
3.7 网络命令
write 发信息给服务器上其他用户,登录了的用户才能发信息 最初的及时通讯 ctrl+d结束
wall 给所有在线用户发信 , writeall的意思
ping 给远程用户发送icmp包,检测目标是否存在,每经过一个路由节点ttl减少1 不同系统ttl初始值不一样 可以大概判断对方操作系统类型 linux是64
ifconfig 查看当前网络 eth0是初始网卡 lo是回环网卡用户检测tcpip是否通畅,mac地址是固话在网卡的只读存储器中的地址不可变
ifconfig eth0 192.0.0.0 可以临时更改ip
mail 邮件命令 用户不在线也可以 mail用户名发信 mail啥都不跟收信 输入help查看帮助 输入序列号查看信 h可以看到信列表 d 1 删除邮件
last 重启信息都有 所有用户登录信息 非常有效 常用的命令
lastlog 同last只记录最后一次登录 lastlog -u 502指定用户
traceroute 显示数据包到主机间的路径 凡走过必留痕迹 结果显示**是被该节点屏蔽了
netstat 显示网络相关信息 -t tcp协议 -u udp协议 -l 监听 -r路由 -n 显示ip端口
netstat -tlun 查看本机监听的端口
netstat -an 查看本机所有的网络连接
netstat -rn 查看本机路由
tcp 传输控制协议 有三次握手协议 更可靠 类似打电话
udp 用户数据报协议 更快 类似发短信
tcp才可以监听端口 udp不可以 udp可以直接发送
发起端口是随机的 目标端口才是22 80等端口
setup 修改网络, 是redhat中特有的 其他版本没有 永久生效
yum install -y setuptool
安装工具组件如 ntsysv(系统服务)system-config-networktui(网络服务)iptables(防火墙配置)
yum install system-config-securitylevel-tui
yum install iptables
yum install ntsysv
yum install system-config-network-tui centos7,已经setup已经无法配置网络了,该命令中无法找到,推荐使用nmtui命令
service network restart 重启网卡
mount 挂载
mount -t iso9660 /dev/sr0 /mnt/cdrom
/dev/cdrom 是/dev/sr0的软连接
-t iso9660 可以不写 默认就是
umount /dev/sr0
如果正在挂载目录中,是卸载不了提示设备忙,要退出挂载目录
3.8 关机重启命令
shutdown
shutdown -h now
shutdown -h 8:30
shutdown -r now
shutdown -r 8:30
最早期只有shutdown 可以正确保存服务,目前其他命令也可以不过推荐使用shutdown
-c 取消前一个关机命令
-h 关机
-r 重启
服务器不能关机 只能重启 谨记
halt
poweroff 相当于直接断电 比较危险
init 0
上面3个命令也可以关机
reboot重启
init 6也可以重启
系统运行级别:表示linux启动时候可以进入的级别号
0 关机
1 单用户 类似win启动f8安全模式,启动最小服务,启动最小核心程序,用户修复系统,只能root登陆,没有图形界面和win安全模式不一样
2 不完全多用户,不含nfs服务 nfs验证机制弱,不建议用这个文件共享
3 完全多用户
4 未分配
5 图形界面
6 重启
cat /etc/inittab 是init的配置文件 别改0或6 改错就不好了
x11代表图形界面 x表示x-window
runlevel 查询系统运行级别
logout 注销 做完操作一定要退出 防止安全隐患
4 vim文本编辑器
vim是vi的增强版
vim是功能非常强大的全屏幕文本编辑器,是linux/unix中最常用的编辑器
vim没有菜单只有命令
命令模式
插入模式 iao进入 esc退出
编辑模式 输入: 进入编辑模式 命令以回车结束 :set nu 显示行号 :wq保存退出
插入命令
a 在后面插入
a 在行尾插入
i 在前面插入
i 在行首插入
o 在下行插入
o 在上行插入
定位命令:
:set nu 显示行号
:set nonu 取消行号
gg 到第一行
g 到最后一行
ng 到第n行
:n 到第n行
$ 移到行尾
0 移到行首
删除命令:
x 删除光标出字符
nx 删除光标所在处后n字符
dd 删除当前行
dg 删除光标所在行到文件尾
d 删除光标所在处到文件尾
:n1,n2d删除指定范围行
复制和剪切命令:
yy 复制当前行
nyy 复制n行
dd 剪切当前行
ndd 剪切多行
p、p 粘贴到当前行下或者行上
替换和取消命令
r 替换单个字符
r 多个字符替换,esc结束
u 取消上一步操作 undo
搜索和搜索替换命令:
/string 搜索字符串 搜索时候忽略大小写:set ic 取消 :set noic n下一个
:%s/old/new/g 全文替换 %s表示全文替换
:n1,n2s/old/new/g 范围替换 g可以换c 表示需要询问
不加g表示只对搜索字符串的首次出现进行替换
保存退出命令:
:w 保存
:w new_filename 另存为
:wq 保存退出
zz 是:wq的快捷键
:q! 不保存退出
:wq! 强制保存退出 文件所有者和root可以操作
导入命令执行结果 :r !命令 :r 文件名
定义快捷键 :map 快捷键 触发命令
:map ^p i#<esc> ^p 是ctrl+v+p 来输入 颜色不一样 代表快捷键ctrl+p
连续注释 :n1,n2s/^/#/g
:n1,n2s/^#//g
:n1,n2s/^/\/\//g 避免转义符 可以用#或者其他字符来表示分割
ls是别名 \ls 转义符可以使用ls本来命令
自动替换 :ab mymail yongestcat@126.com
这些设置重启失效 要永久生效 要写入对应用户的home目录下的vim配置文件 /root/.vimrc 这里面只能放编辑模式的命令 不用加:
5 软件包管理
软件包分类:
源码包(看到源码 安装慢 但是更加稳定执行效率高 系统高度适配 卸载方便 可以*选择所需功能,安装步骤多,编辑时间长,安装一旦报错新手工解决)
>脚本安装包 特殊的源码包 一般是install.sh安装 给初学者用的
二进制包(经过编译 安装快 资源利用率稍低 包管理简单 源码不可见 功能选择不如源码包灵活 依赖性):rpm包、系统默认包
rpm命令管理
httpd-2.2.15-15.el6.centos.l.i686.rpm
软件包名 软件版本 软件发布次数 适合的linux平台 适合的硬件平台 noarch表示适合任何硬件平台 没写linux平台表示适用所有linux平台
包名 安装过的 /var/lib/rpm/中的数据库
包全名 未安装过的 绝对路径
rpm包依赖性
典型的是树形依赖 a->b->c
环形依赖 a->b->c->a abc用一条命令安装可以解决
模块依赖 模块依赖查询网站 www.rpmfind.net
1.安装软件:执行rpm -ivh rpm包名,如:
#rpm -ivh apache-1.3.6.i386.rpm -i install 安装 -v 详细 -h 显示进度 --nodeps 不检测依赖性,一般不用
2.升级软件:执行rpm -uvh rpm包名。
3.反安装:执行rpm -e rpm包名。
4.查询软件包的详细信息:执行rpm -qpi rpm包名 可以查未安装的包
5.查询某个文件是属于那个rpm包的:执行rpm -qf rpm包名
6.查该软件包会向系统里面写入哪些文件:执行 rpm -qpl rpm包名
rpm -qa|grep
rpm -qi 包名
rpm -qf 文件名
rpm -qrp 包名 查依赖
rpm -v 校验
s 文件大小是否改变
m 文件的类型或权限是否被改变
5 md5校验是否改变
d 代码是否改变
l 文件路径是否改变
u 文件的属主是否改变
g 文件的属组是否改变
t 文件的修改时间是否改变
文件类型:
c 配置文件
d 普通文件
g ghost文件,就是该文件不应该被rpm包含,很少见
l 授权文件
r 描述文件
rpm包文件提取:
rpm2cpio 包全名 | \ 将rpm格式改为cpio格式
cpio -idv .文件绝对路径 i copy-in模式,还原 d还原时自动新建目录 v详细 cpio是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
yum在线管理
自动解决依赖性问题,不能上网 可以用光盘作为yum源
yum在redhat中需要收费
网络yum源 vi /etc/yum.repos.d/centos-base.repo
[base] 容器名称
name 容器说明,自己随便写
mirrorlist 镜像站点 可以注释掉
baseurl yum源服务器地址
enabled 是否有效 不写默认是1 表示有效
gpgcheck 1表示rpm的数字证书生效
gpgkey 数字证书的公钥文件保存位置。不用修改
yum命令
yum list 查询可用软件包
yum search 包名 查询
yum中没有包全名概念,全用包名
yum install -y 包名 安装包
yum -y update 包名 升级 如果没写包名就是全部升级包括内核 会导致服务器崩溃 因为需要本地配置些 慎用
yum -y remove 卸载 会把依赖的包也卸载 这些卸载的依赖包可能被别的软件依赖 卸载命令不安全
安装的时候最小化安装 尽量不卸载 不全局升级
yum grouplist 查询软件组
yum groupinstall 软件包组
yum groupremove 软件包组
光盘yum源搭建:
挂载
网络yum源失效 enable=0或者改名其他yum源文件
修改 centos-media.repo enable=1 地址改为file:///mnt/cdrom
源码包安装是人为手工指定安装位置 而rpm是默认位置
rpm默认安装位置
/etc/ 配置文件安装目录
/usr/bin 可执行文件安装位置
/usr/lib 库文件位置
/usr/share/doc 手册位置
/usr/share/man 帮助文件位置
源码包一般安装在 /usr/local/软件名 这是系统给准备的第三方软件位置
安装位置不同带来的影响 服务的管理
rpm包安装的服务可以用系统服务管理命令service来管理,例如rpm包安装的apache启动方法/etc/rc.d/init.d/httpd start 或 service httpd start
service 命令是红帽专有命令 别的linux发行版不一定有
service命令不能管理源码包安装的服务
源码安装:
需要gcc编译器
下载源码包
解压 进入目录
./configure --prefix=/usr/local/apache2 定制功能、检测系统环境是否符合、将定义的功能和检测的信息写入makefile文件,用户后续的编辑
make && make install 编译 编译安装 make clean
报错:安装停止且出现warning、error、no等提示
脚本安装:
自动安装的源码包 适合新手 下一步下一步那种
6 用户和用户组管理
相关配置文件
/etc/passwd 用户信息文件 7个字段
用户名 密码标志x表示有密码 如果没有的话 不校验密码登陆不过只能本机登陆 不能远程
uid 0:超级用户 1-499 系统用户(伪用户 不能登陆不能删除) 500-65535 普通用户
root不一定是管理员 uid=0的一定是管理员 普通用户改为uid0就变成管理员了
gid:初始组id
用户说明
家目录
登陆之后的shell
初始组:有且只有一个一般和用户名相同 能改 但是不推荐改
附加组:可以有多个
影子文件 /etc/shadow 权限000 9个字段
用户:
密文密码sha512散列加密 比之前的md5更安全(同一个密码加密出来的也不一样)如果!!或者*表示没有密码表示不能登陆:
密码最后一次修改日期 时间戳 1970年1月1日 没过1天 加1算出来的时间戳
两次密码的修改间隔
密码有效期
密码到期前的告警天数
密码到期后的宽限天数 0表示过期后立即失效 -1表示密码永远不失效
账号失效时间 时间戳表示
保留
时间戳换算
date -d "1970-01-01 16066 days"
echo $(($(date--date="2014/01/06"+%s)/86400+1))
组信息文件/etc/group
组名
组密码标志
gid
组中附加用户
添加用户会生成一个同名组作为用户主组
/etc/gshadow 组名 组密码 组管理员用户名 组中附加用户
用户的邮箱
/var/spool/mail/用户名/
用户模板目录
/etc/skel/
用户管理命令
useradd 选项 用户名
-u uid 手工指定uid
-d 家目录
-c 用户说明
-g 组名
-g 附加组
-s shell
用户默认值文件/etc/default/useradd
group=100 #用户默认组 公有模式 私有模式
home=/home #用户家目录
inactive=-1 #密码宽限天数(shadow文件7字段)
expire= #密码失效时间(8)
shell=/bin/bash #默认shell
skel=/etc/skel #模板目录
create_mail_spool=yes #是否建立邮箱
/etc/login.defs 定义了shadow文件中7 8字段之外的字段
pass_max_days 9999 # 5字段
pass_min_days # 4
pass_min_len 5 #最小8位 这个5 没用 现在pam文件生效
pass_war_age 7 #6
uid_min 500
uid_max 60000
encrypt_method sha512
添加用户默认值都靠上面两个文件
passwd命令
-s 查询用户密码状态 仅root可用
-l 暂时锁定用户 仅root shadow文件密码暗文前面加双!!
-u 解锁用户 仅root
--stdin 可通过管道符输出的数据作为用户的密码
echo "123" | passwd --stdin lamp 一般用与shell编程
whoami
usermod 修改用户信息
-u 修改uid
-c 说明 有空格用双引号
-g 加入附加组
-l 锁定
-u 解锁
chage 修改用户密码状态
-l 列出用户的详细密码状态
-d 日期:修改密码最后一次更改日期(shadow 3字段)
-m 天数: 两次密码修改间隔(4字段)
-m 天数: 密码有效期(5字段)
-w 天数: 密码过期前警告天数(6字段)
-i 天数: 密码过期后宽限天数(7字段)
-e 日期: 账号失效是加(8字段)
chage -d 0 king 要求用户一登陆必须改密码 其他的基本都不用记 直接修改shadow文件更直观
userdel命令 删除用户
-r 同时删除家目录
手工删除用户
vi /etc/passwd
vi /etc/shadow
vi /etc/group
vi /etc/gshadow
rm -rf /var/spool/mail/lamp
rm -rf /home/lamp
id user1 查看用户信息
su 切换用户
- 选项表示同时切换环境变量 su root 和su - root env命令可以查看环境变量
-c 仅执行一次命令 不切换身份 su - root -c "useradd user3"
groupadd 添加组
-g gid 指定组id
groupmod 修改组
-g gid 改组id
-n 新组名 改组名
groupdel 删除组
如果组中有用户,组中有初始用户 不能删,如果是附加组 可以删除
gpasswd 把用户添加组或者从组中移除
-a 用户名
-d 用户名
7 权限管理
acl权限 解决身份不足问题 所有者所属组其他人 不够用
查看分区acl权限是否开启
dumpe2fs -h /dev/sda1 默认支持acl default mount options: user_xattr acl
-h 仅显示超级块中信息,而不显示磁盘组的详细信息
临时开启分区acl权限
mount -o remount,acl / #重新挂载根分区,并挂载加入acl权限
永久开启acl
vi /etc/fstab 文件 系统开机自动挂载 写错了的话 系统可能崩溃 一定小心
defaults,acl 万一默认不支持 后面,acl 重启生效
查看acl命令
getfacl 文件名 不支持绝对路径 报错但是不影响
设定acl权限
setfacl命令
-m 设定acl
-x 删除指定acl
-b 删除所有acl
-d 设定默认acl
-k 删除默认acl
-r 递归设置acl
chown root:tgroup /project
chmod 770 /project
setfacl -m u:st:rx /project u表示用户 g表示组
给用户st赋予r-x权限,u:用户名:权限
setfacl -m g:group2:rx /project
drwxr-xr-x+ 2 root root 4096 sep 6 11:41 king 多个+号表示有acl权限
最大有效权限mask
如果给用户赋予了acl权限,是需要和mask的权限相与才能得到真正权限
不影响所有者的权限 但是影响acl和所属组的权限
setfacl -m m:rx 文件名 设置mask
setfacl -b 文件
setfacl -x g:tgroup2 /project/
递归acl权限 -r选项 注意只能放后面 老的文件都要递归设置下
默认acl权限 如果给父目录设定了默认acl权限,那么父目录中所有新建的子文件都会,只针对新文件 -r可以不取消
setfactl -m d:u:用户名:权限 文件名
文件特殊权限
setuid的功能:(危险)
只有可以执行的二进制程序才可以设定suid权限
命令执行者要对该程序有x权限
命令执行者在执行该程序时获得该程序文件的属主的身份(在执行程序的过程中灵魂附体为文件的属主)
setuid权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
passwd命令有suid权限 在执行期间可暂时获得root身份得以改写shadow文件
-rwsr-xr-x. 1 root root 27832 jun 10 2014 /usr/bin/passwd
cat没有suid权限,所以普通用户不能查看/etc/shadow文件内容
设定方法 4代表suid
chmod 4755 文件
chmod u+s 文件名
用户必须对他有执行权限,否则显示大写s,表示报错
危险的suid权限,系统一些suid权限的是迫不得已,轻易不能设置,并且定期巡检
比如给vim加suid权限,那么普通用户,红色表示危险,系统警告,然后vim普通用户也能改系统关键信息比如shadow文件等
sgid也可以针对目录:(不那么危险)(用处不大)
普通用户必须对此目录有rx权限,才能进入此目录
普通用户在此目录中的有效组会变成此目录的属组
若普通用户对目录有w权限时候,新建的文件的默认属组是这个目录的属组
sgid针对文件:(危险)
只有二进制可执行文件可以设置sgid
命令执行者要有x权限
命令执行时候组身份升级为该程序属组
只在执行程序时候有效
locate命令就是这样的 有sgid权限 临时提升为slocate用户组
/var/lib/mlocate/mlocate.db数据库
sgid 在所属组中有s权限 2代表
chmod 2755 文件
chmod g+s 文件名
sbit权限 黏着位权限 对root无效(不危险)
只对目录有效
普通母对该目录有wx权限,即普通用户可以在此目录拥有写入权限
如果没有黏着位,因为木桶用户有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一旦赋予黏着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,不能删除其他用户建立的文件
chmod 1755 目录
chmod o+t 目录
chmod 7755 文件 特殊权限位 7没有作用 根据需要赋予
文件系统属性chattr权限: 对root也能限制
chattr [-rvf] [-+=aaccddeijssttu] [-v version] files...
+-=权限
i:针对文件,那么不允许对文件删除改名,也不能添加和修改数据 相当于锁起来了;针对目录,那么只能修改目录下文件的数据 单不允许建立和删除文件
a:针对文件,那么只能在文件中增加数据,但是不能删除也不能修改数据;针对目录,那么只能在目录中建立和修改文件,不能删除文件
lsattr命令: 文件系统属性查看 -a -d
这也不能限制到root 只是防止误操作
selinux可以限制root
sudo权限 su指的是switch user,并不是super do
root把本来只能超级用户执行的命令赋予普通用户执行
sudo的对象是系统命令
visudo #实际修改的是/etc/sudoers文件
root all=(all) all
用户或者组(%组名) 被管理的主机=(可使用的身份) 命令 (绝对路径)
man 5 sudoers
8 文件系统管理
分区和文件系统
主分区:总共最多4个
扩展分区:只能有1个,并且也算主分区的一种,主分区+扩展分区最多4个。但是扩展分区不能存储数据和格式化,必须再划分为逻辑分区才能使用
逻辑分区:逻辑分区是在扩展分区中划分的,如果是ide硬盘,linux最多支持59个逻辑分区,入股欧式scsi硬盘linux最多支持11个逻辑分区
逻辑分区从sda5开始编号,就算主分区不足4个,sd表示sata硬盘,hd表示ide硬盘,也就是第一个逻辑分区一定是5
文件系统:
ext2:是ext文件系统升级版本,red hat linux 7.2版本以前系统默认都是ext2文件系统。1993年发布,最大支持16tb的分区和最大2tb的文件
ext3:和ext2支持大小一样,区别是支持日志功能
ext4(现在主流分区):centos6以后的主流分区,最大支持1eb和单个16tb文件,在性能、伸缩性、可靠性方便大量改进,ext4的变化是翻天覆地的,向下兼容ext3,无限数量子目录、extents连续数据块概念、多块分配、延迟分配、持久预分配、快速fsck、日志校验、无日志模式、在线碎片整理、inode增强、默认启动barrier等
常用命令:
df 统计文件系统的占用情况
-h 人性化显示
du 统计目录大小
du -sh /etc/
-h
-s 统计和
df和du统计根分区不一样大小,df是从文件系统考虑,不仅考虑文件占用的空间,还要统计呗命令或程序占用的空间(最常见的就是文件已经删除但是程序并没有释放空间),定期重启还原系统状态
df看到的剩余空间才是真正的空间
du命令是面向文件的,只会计算文件或目录占用的空间
fsck 文件系统修复命令
-a 不用显示用户提示,自动修复文件系统
-y 自动修复,和-a一致,不过有些系统只支持-y
该命令不需要人工执行,系统启动的时候自动检测,知道就好
dump2fs 显示磁盘状态命令,最主要是的看分区数据块大小和是否支持acl
mount 挂载命令
mount [-l] 查询系统中已经挂载的设备,-l会显示卷标名称 这些输出内容又叫超级块的内容
mount -a 根据配置文件/etc/fstab的内容,自动挂载
命令格式
mount [-t 文件系统] [-l 卷标名] [-o 特殊选项] 设备文件名 挂载点
fat32识别vfat fat16 识别fat
-t 文件系统:加入文件系统类型来指定挂载的类型,可以ext3,ext4,iso9660等文件系统
-l 卷标名:挂载指定卷标的分区,而不是安装设备文件名挂载 没啥用处 起个别名的意思
-o 特殊选项:可以指定挂载的额外选项
atime/noatime 更新访问时间/不更新访问时间。访问分区文件时,是否更新文件的访问时间,默认更新
async/sync 异步/同步,默认为异步
auto/noauto 自动/手动,mount -a命令执行时,是否会自动安装/etc/fstab文件内容挂载,默认为自动
defaults 定义默认值,相当于rw,suid,dev,exec,auto,nouser,async这7个选项
exec/noexec 执行/不执行,设定是否允许在文件系统中执行可执行文件,默认exec允许 有时候程序不能运行不一定是权限的事情
remount 重新挂载已挂载的文件系统,一般用户指定修改特殊权限 比较常用
rw/ro 读写/只读,文件系统挂载时,是否具有读写权限,默认是rw
suid/nosuid 具有/不具有suid权限,设定文件系统是否具有suid和sgid的权限,默认是具有
user/nouser 允许/不允许普通用户挂载,设定文件系统是否允许普通用户挂载,默认不允许只有root可以
usrquota 写入代表文件系统支持用户磁盘配额,默认不支持
grpquota 写入代表文件系统支持组磁盘配额,默认不支持
umount 设备文件名或者挂载点 --先卸载才能弹出光盘 真机器中不卸载 不能在光盘目录中卸载会报错正忙
挂载u盘
fdisk -l
mount -t vfat /dev/sdb1 /mnt/usb
linux默认不支持ntfs格式
如何支持ntfs格式 :手工编译内核 将新的驱动加进来;下载ntfs-3g插件 http://www.tuxera.com/community/ntfs-3g-download
手工分区fdisk
fdisk /dev/sdb
m 帮助
n 新建
l 显示
d 删除
w 保存
partprobe命令重新读取分区表 有时候分区表正在被占用需要重启才能下一步,那就直接用这个命令 当做分区之后必定执行的命令
+2g
格式化分区
mkfs -t ext4 /dev/sdb1
然后创建挂载点挂载即可
自动挂载
/etc/fstab配置文件6个字段
第一字段:分区设备文件名或者uuid(硬盘通用唯一识别码) uuid防止分区改顺序 dumpe2fs -h /dev/sdb1能查到uuid
第二字段:挂载点
第三字段:分区类型
第四字段:挂载参数,和mount的挂载权限一致
第五字段:指定分区是否被dump备份,0代表不备份,1每天备份,2 不定期备份 lost+found是自动备份位置
第六字段:指定分区是否被fsck检测,0代表不检测,其他数字代表检测的优先级,那么当然1的优先级比2高
如果弄错,系统启动崩溃 所以不应该先重启 应该mount -a
如果崩溃 恢复 启动时候输入root密码可以操作 不过根分区是只读的 remount下挂为读写 然后重新编辑这个文件修复错误
mount -o remount,rw /
分配swap分区
free命令 查看内存与swap分区使用状况 -m 以兆显示 -h
cached(缓存):是指把读取出来的数据保存在内存当中,当再次读取时,不用读取硬盘而直接从内存中读取,加速了数据的读取过程
buffer(缓冲):是指在写入数据时,先把分散的写入操作保存到内存中,当达到一定程度再集中写入硬盘,减少磁盘碎片和硬盘的反复寻道,加速了数据的写入过程
fdisk /dev/sdb 建立个逻辑分区 83标准分区 t来改变分区id 改为82 就是swap分区 partprobe
格式化 mkswap /dev/sdb6
swapon /dev/sdb6 加入swap
swapoff /dev/sdb6 取消swap
swap开机自动挂载 /etc/fstab 和普通一样 挂载点是swap
9 shell 基础
shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动挂起停止甚至编写一些程序。
硬件-->内核-->shell-->外层应用程序
window图形交互界面也是shell
shell还是一个功能强大的编程语言,易编写,易调试,灵活性较强。shell是解释执行的脚本语言,在shell中可以直接调用linux系统命令。
分类:bourne shell(linux识别为sh),c shell(主要用在bsd版)
shell的两种主要语法类型:bourne和c 两个语法结构完全不同
bourne家族主要包括:sh(单用户模式用的是这个)、ksh、bash(主流,和sh兼容)、psh、zsh
c家族主要:csh、tcsh
/etc/shells 可以查询到系统支持哪些shell
shell脚本的执行方式:
echo输出命令 -e 支持反斜线控制的字符转换
\\ 输出\本身
\a 输出警告音
\b 退格键
\c 取消输出行末的换行符。和“-n”选项一致
\e escape键
\f 换页符
\n 换行符
\r 回车
\t 制表符 tab
\v 垂直制表符
\0nnn 按照8进制ascii码表输出字符。其中0为数字0零,nnn是三位八进制数
\xhh 按照16进制ascii码表输出字符。其中hh是两位16进制数
echo -e "\e[1;31m abcd \e[0m"
\e[1;开启颜色输出
\e[0m关闭颜色输出
30m=黑色 31m=红色 32m=绿色 33m=黄色 34m=蓝色 35m=洋红 36m=青色 37m=白色
第一个脚本
vi hello.sh
#!/bin/bash 这不是注释 不写不影响运行 单要求必须写
#the first program
#author:king
echo -e "hello world"
sh hello.sh
cat -a显示包括隐藏
win和linux的回车符不一样
dos2unix来转换文件
bash基本功能
历史命令和补全
历史命令history -c 清空历史命令 -w 把缓存保存~/.bash_history 正常登陆退出才写入
默认保存1000条 /etc/profile 可以更改
上下箭头可以调用历史命令 !n可以可以重复第n条命令 !!重复执行上一条命令 !字符串 执行最后一条字符串开头的命令
ctrl+r 可以反查历史命令
命令 文件 目录 都可以tab补全 多个的话 tab两次列出可执行的
命令别名和常用快捷键
alias 别名='原命令'
命令执行顺序:
1.绝对路径或者相对路径
2.别名
3.bash内部命令
4 按照$path环境变量定义的目录查找顺序找到的第一个命令
unalias 别名 删除别名
永久别名生效.bashrc修改
bash常用快捷键:
ctrl+a 把光标移动到命令行开头。如果我们输入的命令过长
ctrl+e 把光标移动到命令行结尾
ctrl+c 强制终止当前命令
ctrl+l 清屏 相当于clear
ctrl+u 删除或者剪切光标之前的命令
ctrl+k 删除或者剪切光标之后的内容
ctrl+y 粘贴ctrl+u或者k的内容
ctrl+r 在历史命令中搜索,命令反查
ctrl+d 退出当前终端
ctrl+z 暂停,并放入后台。这个快捷键牵扯工作管理的内容
ctrl+s 暂停屏幕输出
ctrl+q 恢复屏幕输出
输入输出重定向:
标准输入输出:
设备 设备文件名 文件描述符 类型:
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出
输出重定向:
标准输出重定向 命令>文件 命令>>文件 分别是覆盖和追加,把命令的输出输出到指定的文件或设备中
标准错误输出重定向 错误命令 2>文件 错误命令 2>>文件
正确输出和错误输出同时保存:
命令>文件 2>&1
命令>>文件 2>&1
命令 &>文件
命令 &>>文件 这四个命令都是把正确输出和错误输出放到同一个文件
命令 >> 文件1 2>> 文件2 正确放1,错误放2
ls &>/dev/null 不管正确错误 只管执行就好
输入重定向:用的不多 一般只给源码包打补丁时候用
wc [选项] [文件名]
-c 统计字节数
-w 统计单词数
-l 统计行数
命令<文件
命令<<符号 。。。。 符号 常见的符号用eof
多命令顺序执行与管道符:
命令1 ; 命令2 多个命令顺序执行,命令之间无任何逻辑联系
命令1 && 命令2 当命令1执行正确,命令2才会执行,1执行错误 2不执行
命令1 || 命令2 当命令1执行不正确,则命令2才会执行 命令1执行正确,2就不执行
dd命令 磁盘对拷命令
dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项:if=输入文件 制定源文件或源设备
of=输出文件 指定目标文件或者目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 指定输入/输出多少个数据块
例子:date;dd if=/dev/zero of=/root/testfile bs=1k count=100000;date 可以看命令执行多长时间
ls && echo yes
./configure && make && make install
命令 && echo yes || echo no
管道符 |
命令1 | 命令2
命令1的正确输出作为命令2的操作对象
ll -a /etc/ | more
netstat -an |grep established
命令1必须执行正确否则命令2不执行
grep -i 忽略大小写 -n输出行号 -v反向查找 --color=auto 搜索出的关键字用颜色显示
通配符:
? 匹配一个任意字符
* 匹配0个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。[abc] a或者b或者c
[-] 匹配中括号中任意一个字符。-代表一个范围。[a-z]代表匹配任意一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符。[^0-9]代表匹配一个不是数字的字符
bash中其他特殊符号
'' 单引号。在单引号中所有的特殊符号,如"$"、"`"(反引号)都没有特殊符号
"" 双引号。 在双引号中特殊符号都没有特殊含义,但是"$"、"`"和"\"是例外,拥"调用变量的值"、"引用命令"和"转义符"的特殊含义
`` 反引号。反引号括起来的内容是系统命令,在bash中会先执行他。和$()作用一样,不过推荐使用$(),因为反引号很容易看错
$() 和反引号一样,用来引用系统命令
# 在shell脚本中 #开头的行代表注释
$ 用户调用变量的值,如需要调用变量name的值,需要用$name的方式得到变量的值
\ 转义符,跟在\后面的特殊符号将失去特殊含义,变为普通字符。如\$将输出$符号,而不是当做变量引用
bash变量:
用户自定义变量、
环境变量、
位置参数变量(这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的)(其实是预定义变量的一种,因为较多单独分类)、
预定义变量(是bash中已经定义好的变量,不能自定义,变量作用也是固定的)
变量设置规则:
变量名称可以由字母、数字、下划线但是不能是数字开头
bash中变量的默认类型都是字符串型,如果要进行数值运算,则必指定变量类型为数值型
变量用等号连接值,等号左右两侧不能有空格
变量的值有空格,需要用单引号或者双引号包括
在变量的值中,可以使用\转义符
如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含"$变量名"或用${变量名}包含
可以把命令结果赋予变量,用反引号或$()
环境变量名建议大写,便于区分
本地变量 就是用户自定义变量
变量定义 name="king kong"
变量叠加 aa=123 aa="$aa"456 aa=${aa}789
变量调用 echo $name
变量查看set
变量删除unset name
环境变量 :系统环境变量、*定义的环境变量
用户自定义变量又称作本地变量,因为只在当前的shell中生效,而环境变量会在当前shell和这个shell的子shell中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有shell生效
设置 export 变量名=变量值 #申明变量
env #查询环境变量
unset 变量名 #删除变量
命令pstree 确定进程树
path :分割的一个个路径,是用于系统查找命令的路径
path变量叠加 path="$path":/root/sh
ps1 (严格来说不是环境变量不能用env查看只能用set 他是系统预留专门用作定义系统环境的变量 对系统有特殊含义)
定义系统提示符的变量
\d:显示日期,格式为“星期 月 日”
\h:显示简写主机名。如默认主机名“localhost”
\t:显示24小时制时间,格式为“hh:mm:ss”
\t:显示12小时制时间,格式为“hh:mm:ss”
\a:显示24小时制时间,格式为“hh:mm”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\w:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。如果是root用户为#普通用户$
ps1='[\u@\t \w]\$'
位置参数变量:
$0 $1..0表示命令本身 1 2 表示1 2的参数,10以上用括号${10},用于从命令行传递参数到脚本中
$* 代表命令行所有参数,吧所有的参数看做一个整体
$@ 代表命令行所有参数,所有的参数区分对待
$# 代表命令行中所有参数的个数
$*和$@不是很常用 能看懂即可,可以在执行命令同时输入参数
预定义变量:
$? 上一次命令的结果的返回状态 0正确执行 非0表示不正确执行 具体是哪个数字由写命令的人决定
$$ 当前进程的进程号pid
$! 后台运行的最后一个进程的进程号pid
命令后跟&符号 放入后台执行 类似window最小化窗口
接收键盘输入(较位置参数变量更常用):
read [选项] [变量名]
-p "提示信息"
-t 秒数 等待时间
-n 字符数 只接收指定的字符数,就会执行 (不加的话回车结束)
-s: 隐藏输入的数据 适用于机密信息
数值运算与运算符:
declare -p aa 可以查看变量属性
-:给变量设定类型属性
+:取消变量的类型属性
-i 将变量生命为整数型(integer)
-x: 将变量生命为环境变量
-p:显示变量的被声明类型
数值运算
方法1:定义变量类型declare -i cc=$aa+$bb
方法2:expr或者let数值运算工具 dd=$(expr $aa + $bb) +左右两侧空格不能省略
方法3(推荐):$((运算式))或者$[运算式]
运算符:
优先级(数值越高优先级越高) 运算符 说明
13 -,+ 单目正,单目负
12 !,~ 逻辑非、按位取反或补码
11 *,/,% 乘,除,取模
10 +,- 加减
9 <<,>> 按位左移,按位右移
8 <=,>=,<,> 小于或等于、大于或等于、小于、大于
7 ==,!= 等于,不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= 赋值、运算且赋值
可以用小括号改变优先级
变量测试与内容替换:
通过判断x得到y的情况
变量测试是通过显示x的值,判断y的值;程序执行时用于判断,可以用 if 判断同样实现
环境变量配置文件:
source 配置文件
或
. 配置文件
强制让配置文件直接生效 避免重登陆过程 .就是source的缩写
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如path,histsize,ps1,hostname等默认环境变量
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile --只对当前用户生效 隐藏文件
~/.bashrc
/etc/bashrc
/etc/profile的作用:
user变量:
logname变量:
mail变量:
path变量:
hostname变量:
histsize变量:
umask:
调用/etc/profile.d/*.sh文件
其他配置文件和登陆信息:
注销时生效的环境变量配置文件 ~/.bash_logout
历史命令~/.bash_history 是重要的配错手段 给mysql设置密码是明文放在这儿不安全 需要清空 其他情况不推荐清空
shell登陆信息 不要写欢迎的,写警告信息比较好 法律问题
本地终端欢迎信息:/etc/issue \反斜杠
\d 显示当前系统日期
\s 显示操作系统名称
\l 显示登陆的终端号,比较常用
\m 显示硬件体系结构,如i386,i686
\n 显示主机名
\o 显示域名
\r 显示内核版本
\t 显示当前系统时间
\u 显示当前登陆用户的序列号
alt+f1 f6切换6个登陆终端
远程终端欢迎信息:/etc/issue.net
转义符在/etc/issue.net不能使用
是否显示欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,假如"banner /etc/issue.net"行才能显示(记得重启ssh服务)
登陆后欢迎信息:/etc/motd 是登陆后的 之前两个是登陆前的 不管远程还是本地都生效
正则表达式:
基础正则表达式:
grep、awk、sed等命令可以支持正则表达式,正则是包含匹配,在文件中匹配符合条件的字符串
通配符和正则在linux中有不小的区别 ,其他语言中大概是一致的, 通配符是完全匹配,ls、find、cp不认识正则,只识别shell自己的通配符
正则和通配符有些符号通用但是含义完全不同
元字符 作用
* 前一个字符匹配0次或者任意多次
. 匹配除了换行符外任意一个字符
^ 匹配行首。例如^hello会匹配以hello开头的行
$ 匹配行尾
[] 和通配符一样,匹配中括号中指定的任意一个字符,只匹配一个字符。
[^] 匹配除中括号的字符以外的任意字符。如[^0-9]匹配任意一位非数字字符
\ 转义符
\{n\} 表示其前面的字符恰好出现n次。例如:[0-9]\{4\}匹配4位数字
\{n,\} 表示其前面的字符出现不小于n次。例如:[0-9]\{2,\}表示两位及以上的数字
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次
linux中() + ?是属于扩展正则表达式,用的不多
字符截取命令:
cut:提取列 字段提取命令 和grep结合使用 行列提取
-f 列号 : 提取第几列
-d 分隔符: 指定分隔符 (默认制表符 而不要用空格)
cat /etc/passwd |grep /bin/bash|grep -v root|cut -d ":" -f 1
命令局限 分隔符不定的时候不好使
printf 格式化打印命令 常用在下面awk命令
printf '输出类型输出格式' 输出内容
%ns:输出字符串,n是数字指代输出几个字符
%ni:输出整数。n是数字指代输出几个数字
%m.nf:输出浮点数。m n是数字,指代整数位和小数位
输出格式:
\a 输出警告声音
\b 输出退格键
\f 清屏
\n 换行
\r 回车
\t 水平输出退格键,也就是tab键
\v 垂直输出退格键,也就是tab键
printf '%s' $(cat student.txt) #不调整输出格式
printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt) #调整输出格式
print命令会在每个输出后加换行符,linux默认没有这个命令
printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
awk:提取列 都不叫命令了 awk编程 相对复杂太多
awk '条件1{动作1}条件2{动作2}...' 文件名
条件 (pattern):
一般使用关系表达式作为条件
动作(action):
格式化输出
流程控制语句
awk '{printf $2 "\t" $6 "\n"}' student.txt
df -h|awk '{print $1 "\t" $3}'
print在awk内部默认是有的,在linux系统中默认没有
awk默认是空格和制表符作为分隔符
begin命令 awk 'begin{printf "this is a test\n"}{print $2} ' student.txt
fs内置变量 指定分隔符 awk 'begin{fs=":"}{print $1 "\t" $3}' /etc/passwd
end命令 所有数据读取完后执行end动作
支持关系运算符
cat student.txt | grep -v name | awk '$6 >= 87 {printf $2 "\n"}'
sed命令:是一种几乎在所有unix平台的轻量级流编辑器,主要是用来将数据进行选取替换删除新增的命令,可以用管道符接收数据
和vi不同的是,vi只能修改文件
选项:
sed [选项] '[动作]' 文件名
-n 一般sed命令会把所有数据输出到屏幕,如果加入此选项,则只会把经过sed命令处理的行输出到屏幕
-e 允许应用多条sed命令编辑 多个动作之间用;分割
-i 同时更新源数据
动作:
不加行号表示整个文档
a \: 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行行尾需要用"\"代表数据未完结。
c \: 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行行尾需要用"\"代表数据未完结。
i \: 插入,在当期行前插入一行或者多行。插入多行时,除最后一行外,每行行尾需要用"\"代表数据未完结。
d: 删除,删除指定行
p: 打印,输出指定的行
s: 字符替换,格式为"行范围s/旧字串/新字串/g" 类似vi中的替换
se