续前“Linux学习笔记(7~12)”
13、bash脚本编程字符串测试及for循环
- bc<<<" "
- for循环
- 求1-100的和
- for 变量 in 列表; do
- 循环体
- done
- for 变量 in 列表; do
- 生成列表:`seq [起始数] [ 步进数] 结束数`
- declare -i sum=0:声明sum为一个整型( let sum =0) [-x],声明为环境变量
- for i in `seq 1 $Lines`;do echo "Hello,`head -n $i /etc/passwd | tail -1 | cut -d: -f1`";done:向每个用户问好,
- 求1-100的和
14、vi:Visual Interfacee
- vim:VI iMproved,语法着色,
- 全屏编辑器,模式化编辑器。
- # vim /path/to/somefile
- 文件可以不存在,目录必须存在
- 打开文件
- # vim +行数 filename:定位到某行
- # vim + filename:定位到文件末尾
- # vim +/pattern:打开文件并定位到第一次被模式匹配到的行的行首
- vim
- vim模式
- 编辑模式(命令模式):默认状态
- 输入模式:输入到文件中的字符
- 末行模式:文件管理类的命令
- 模式转换
- 编辑-->输入:
- i:在当前光标所在的字符前转换为输入模式。
- a:在当前 字符后转换为输入模式。
- o:在当前光标所在行下新建一行并转换为输入模式
- I:当前光标所在行的行首转换为输入模式
- A:当前光标所在行的行尾转换为输入模式
- O:在当前光标所在行上新建一行并转换为输入模式
- 输入-->编辑
- ESC
- 编辑-->末行
- 输入 :
- 末行模式下
- 10d:删除第10行
- 10,20d:删除第10--20行
- set nu:显示行号,set nonu取消显示行号
- !sh命令:
- 末行-->编辑
- ESC,ESC
- 编辑-->输入:
- vim模式
- 关闭文件
- 末行下:键入w保存,q退出而不保存,wq保存并且退出,q!不保存并且退出,w!强行保存,wq==x保存退出
- 编辑模式下:ZZ保存退出
- 移动光标
- 逐字符移动:hljk对应左右下上。
- 移动指定数字的字符:编辑模式 数字h
- 逐单词移动:w移到下一个单词的词首,e跳到当前或下个单词词尾,b跳到当前或前一个单词的词首,数字w 一次跳多个单词
- 行内跳转:0跳到行首(绝对),^跳到行首(第一个非空白字符),$行尾
- 行间跳转:数字G,直接跳到某行,G最后一行,末行模式下直接输入行号回车即可
- 翻屏:CTRL+F,CTRL+L,向下,上翻一屏,CTRL+d,u 向下,上翻半屏。
- 删除d
- 单个字符:x,数字x 删除光标所在处(向后)的字符
- d命令:d$,删到行尾部,d0,删除到行首,dw,逐单词删除,数字d跳转符 dw de db dd(删行,删除当前光标所在行)
- 末行模式下,10,20d,删除第10到20行,.,+5d 从当前行开始再向下五行,.,100d从当前行到第100行
- 最后一行$,向下n行+n,
- vim最近修改的内容可以撤销
- 粘贴p
- p,小写,删除或复制的为整行,粘贴至下方,否则,粘贴至光标所在字符后面
- P,大写,删除或复制的为整行,粘贴至上方,否则,粘贴至光标所在字符前面
- 复制y
- 用法同d,yy复制一行,y0,.,+3y
- 修改c,先删除内容再转换为输入模式
- 用法同d,cc删除整行并转换为输入模式,...
- 替换r
- r,字符,将r处字符替换
- R,进入替换模式,
- 撤销编辑u
- u:undo撤销,撤销前一次操作,可多次使用,连续u,撤销n次(最多50)
- 数字u:撤销最近多次操作。
- 撤销撤销
- CTRL+r:撤销刚才的撤销操作,还原最近一次撤销操作。
- 重复前一次编辑操作
- . 点命令,
- 可视化模式
- v :按字符选取
- V:按矩形块儿选取
- 查找
- /pattern:全文
- ?pattern:从光标到文首
- n:下一个
- N:上一个
- 支持正则
- 查找并替换
- 末行模式下s命令:addr1,addr2s@pattern@string@g|i 同sed
- 1,$:同%,表示全文
- 替换实例:%s/paern/string/g 全文将pattern替换为string,有/ 需要写为\/ ,pattern中的. 需要转义。
- 如何使用vim打开多个文件
- 复制粘贴可以跨文件,
- 末行下:next,prev上下切换文件,last,first最后第一个文件
- vim file1 file2 file3:同时打开多个文件
- 退出::qa退出所有文件
- 分屏显示一个文件
- 窗口拆分,CTRL+w,s水平拆分窗口,CTRL+w,箭头 切换 CTRL+w,v垂直切分窗口
- 分窗口显示多个文件
- -o:水平分隔显示
- -O:垂直分隔显示
- 将当前文件的部分内容另存为另外一个文件
- :w
- :addr1,addr2w /path/to/file
- 将另外一个文件的内容填充在当前文件中
- :r path/to/somefile在光标下方粘贴
- 与shell交互
- :!command
- 高级
- :set nu,:set nonu行号
- :set ic显示忽略大小写,:set noic
- 设置自动缩进 :set autoindent
- 搜索文本,背景不高亮 :set nohlsearch
- 开启语法高亮 :syntax on
- 非正常退出文本,再次打开报错
- 配置文件
- /etc/vimrc:全局
- ~/.vimrc:用户
- 在于用,不在于记忆:# vimtutor vim课程
- 脚本
- #!/bin/bash
- #
- for I in {1..10};do
- if id user$I&>/dev/null;then
- echo "user$I exist."
- else
- useradd user$I &>/dev/null
- echo "user$I" | passwd --stdin user$I &> /dev/null
- echo "add user$I success!"
- fi
- done
- 三种测试
- 整数测试
- le, lt ,ge, gt, eq, ne
- 字符测试
- == != > < n z
- 文件测试
- e f d r w x
- 组合测试条件
- -a:与 也可 [ ] && [ ]
- -o:或
- !:非
- 取反满足摩根定律
- 整数测试
- 脚本运算
- let I=$[$I+1]
- let sum+=$I 加等,其他类比
- let I++
15、文件查找
- lacate
- 非实时,模糊,根据全系统文件数据库完成:
- locate filename
- 手动更新数据库:updatedb
- 安装:mlocate
- find
- 实时,精确,速度慢,遍历指定目录中所有文件,支持多种查找标准
- find 查找路径==当前 查找标准==指定路径下所有 找到以后的动作==打印到屏幕
- 查找标准
- -name ‘filename’,且filename支持正则表达式
- -iname ‘filename’,文件名匹配不区分大小写
- -regex pattern,基于正则表达式进行文件名匹配
- -user username ,基于属主进行查询
- -group groupname
- -uid uid,用户删除后,其文件显示属主为原先id
- -nouser,查找无属主的文件
- -nogroup,查找无属组的文件
- -type filetype
- f:普通文件
- d:目录
- c:字符设备
- b:块设备
- l:链接
- p:管道
- s:套接字设备
- -size 【+,-】数字【k,m,g】
- 访问时间
- -mtime
- -ctime
- -atime
- [+ | - ] 天数
- -mmin
- -cmin
- -amin
- -perm mode(644):根据权限
- -mode:对应位完全包含即可显示
- /mode:只要有一位匹配即可显示
- mode:精确匹配
- 动作
- 默认为-print
- -ls:类似ls -l,显示匹配到的文件的信息
- -ok command {} \; {}为文件名称占位符,每一个操作都需要用户确认
- -exec:同-ok ,但操作不需要用户确认
- -xargs:从标准输入接收并执行find ... | xargs echo {} >> /tmp/jj.txt
- 组合条件
- -a:默认选项
- -o
- -not
16、特殊权限
- SUID
- 无论哪个用户启动文件,该文件的属主是程序文件自身的属主,而不是启动者。
- 赋予SUID:chmod u+s file,原有x,则为s,否则显示为S。
- 拥有suid,则任何用户启动文件,以文件所有者的权限执行。
- SGID
- 无论哪个用户启动文件,该文件的属组是程序文件自身的属主,而不是启动者所属的基本组。
- chmod g+s file,
- 目录拥有sgid,在目录下建立的文件,文件的基本组不再是用户的基本组,而是目录的基本组
- 测试执行顺序
- 添加用户:useradd user1
- 添加基本组:groupadd develop
- 改目录属组:chmod g+w /tmp/project/
- 目录属组添加sgid: chmod g+s /tmp/project/
- 将用户附加组改为与目录相同:usermod -a -G develop user2
- 此后,user2在/tmp/project下间的新文件,属组为develop,若无sgid,间的文件属组为用户基本组,
- Sticky:在一个公共目录,每个用户均可创建文件,删除自己的文件,但不可以删除别人的文件
- chmod o+t dir
- 000---111:SUID,SGID,Sticky。
- chmod 1755 file : 1代表Sticky,3755,3代表011,SGID和Sticky
- umask为四位,第一位为特殊权限,
17、facl及用户及Linux终端
- FACL:filesystem access control list
- 利用文件扩展保存额外的访问控制权限
- mask,额外的用户(组)给的权限不会超过mask,
- setfacl:设置facl
- -m:设定
- u:UID:perm
- setfacl -m u:Hadoop:rw filename
- setfacl -m d:u:Hadoop:rw filename 为目录设置默认的访问控制列表
- g:GID:perm
- setfact -m g:mygroup:rw filename
- u:UID:perm
- -x:取消设定
- setface -x u:Hadoop filename
- --mask:
- -m:设定
- getfacl:查看facl
- 检查顺序(权限应用次序)
- owner-->facl,user-->group-->facl,group-->other
- 几个命令
- whoami:查看当前登陆的用户
- who:显示当前登陆到系统上的用户
- 终端类型
- 控制台:console,直接连到主机上的物理设备,不属于终端,
- pty:物理终端,相当于控制台,VGA
- tty#:虚拟控制台,通常是在本地,虚拟终端,VGA
- ttys#:串行终端
- pts/#:伪终端,ssh
- -r:显示当前运行级别
- -H:显示头部
- -r:显示当前运行级别及上次运行级别
- 每隔5秒,查看user1是否登陆,如登陆,显示
- sleep
- 终端类型
- w:显示登陆用户以及what
- last:显示登陆日志 /var/log/wtmp文件,登陆历史以及重启历史
- -n:仅显示最近n次
- lastb:显示/var/log/btmp文件,显示用户错误的登陆尝试
- -n
- lastlog:显示每个用户上一次成功登陆时间
- -u username
- basename:显示路径的基名(文件名)
- basename $0:执行脚本时的脚本路径及名称
- mail:
- -s:指定 subject
- # cat /etc/fstab | mail -s "how are you" root 管道命令
- # mail -s "how are you" root < /etc/fstab 输入重定向
- hostname:显示主机名(实时的,非环境变量$HOSTNAME)
- RANDOM:生成随机数,0-32768
- echo $RANDOM
- 随机数生成器:/dev/random,熵池,会被取空,
- /dev/urandom,不会取空,软件模拟生成,
18、bash脚本编程之case语句与脚本选项进阶
面向过程
- 控制结构
- 顺序
- 选择
- if:单分支,双分支,多分支
- case语句
- case SWITCH in
- value 1)
- statement
- ;;
- esac
- 循环
19、磁盘管理
- 机械式硬盘
- RAM:易失
- 分区:partition
- 文件系统
- MBR:master boot record 主引导分区
- 主引导记录
- 属于磁盘,512byte
- 446byte:bootLoader,程序,
- 64byte:每16标识一个分区
- 2byte:魔数 magic number 标记mbr是否有效。
- 真空避灰尘
- metadate
- 文件系统
- 元数据存储区
- 块位图:bitmap
- inode:索引节点
- 硬链接:不同文件名指向同一个文件块儿,指向同一个inode,# ln 源文件 目标文件,不能为文件夹创建,增加被硬链接的次数
- 符号链接,软链接:存储另一个文件的路径,大小为路径字符数,# ln -s 源文件 目标文件,可应用于目录,只保留路径的字符。
- 本文件被硬链接的次数:防止一个文件被多个文件链接,误删。
- # du
- -s:显示每一个的大小
- -h:人性化
- # df
- 显示磁盘分区使用情况
- -h
- -P
- 设备文件
- b:按块为单位,随机访问的设备
- 硬盘
- c:按字符为单位,线性设备
- 键盘
- /dev
- 主设备号:标识设备类型
- 次设备号:标识同一设备类型的不同设备
- # mknod 创建设备文件
- mknod mydev c 66 0
- -m 指定权限
- # tty
- 查看当前终端设备
- echo “hello” >> /dev/pts/1
- 硬盘设备的设备文件名
- IDE,ATA:hd
- a,b,c....来区别同一类型下的不同设备
- /dev/hda /dev/hdb
- 分区:hda1,hda2,...had4 逻辑分区从hda5开始
- 查看当前设备磁盘及其分区# fdisk -l
- 管理磁盘分区fdisk
- SATA,SCSI,USB:sd
- IDE,ATA:hd
- b:按块为单位,随机访问的设备
- 格式化
- 低级格式化:厂商完成
- 高级格式化:创建文件系统# mkfs -t ext3
- 文件系统类型
- 管理方式不同
- /,/usr,/var,/tmp
- 只有/可以自引用。普天之下莫非王土,率土之滨莫非王臣。
- fdisk
- # fdisk /dev/sda 打开交互式界面
- p:显示当前硬盘的分区,包括没保存的
- n:创建新分区
- e:扩展
- p:主分区
- d:删除一个分区
- w:保存退出
- q:不保存退出
- t:修改分区类型
- l(L):显示支持的所有类型
- # partprobe 5.x
- 通知内核重读硬盘分区表
- /proc/partitions
- # fdisk /dev/sda 打开交互式界面
- VFS
- 虚拟文件系统,对应内核,沙漏模型。
- 块大小:block size
- 1024,2048,4096
- 位图,bitmap
- 加快数据查找速度
- super block
- boot block每个分区都有,引导操作系统,
- index node:inode
- mkfs
- -t:fstype,
- # mke2fs:专门管理ext系列文件
- -j :创建ext3类型的文件
- -b BLOCK_SIZE:指定块儿大小,默认4096,,1024,2048
- -L LABEL:指定分区卷标
- -m #:指定预留给超级用户的块数百分比
- -i # :指定为# 个字节指定一个inode,默认8192
- blkid 设备名
- 查询或查看磁盘设备的相关属性
- # e2label 设备:查看或设置卷标
- # tune2fs -j 设备名
- 不损害文件,调整文件系统类型(ext2-->ext3)
- -L:设定或修改卷标
- -m # :调整预留百分比
- -r #:指定预留块儿数
- -o acl:指定默认挂载选项
- -c # 指定挂载次数达到# 次后自检,0或-1关闭
- -i # 指定挂载# 天后进行自检,0或-1关闭
- -l:显示超级块儿的信息
- # dumpe2fs:显示文件属性信息,更加详细
- -h:只显示超级块儿信息
- # dumpe2fs:显示文件属性信息,更加详细
20、压缩及归档
- 压缩格式:gz,bz2,xz,zip,Z
- 压缩算法
- 压缩命令
- compress,uncompress
- gzip:.gz
- 默认会删除原文件
- -d:解压缩
- gunzip:解压缩,完成后删除原文件
- -# :指定压缩比,1-9,默认6
- zcat:临时查看压缩文件的内容
- bzip2:.bz2
- 比gzip压缩比大,使用格式类似。
- -k:压缩时保留原文件
- -d:解压缩
- bunzip2
- bzcat:临时查看压缩文件的内容
- xz:.xz
- 压缩比更大
- -d:解压缩
- xzdec:解压缩到屏幕
- unxz
- xzcat
- archive:归档
- zip:可以压缩目录,既归档又压缩
- # zip 目的.zip 源..... 压缩后不删除源文件
- unzip:
- tar:只归档不压缩
- -c:创建归档文件
- -f file.tar:操作的归档文件
- # tar -cf test.tar test*
- -x:展开归档
- --xattrs:归档时,保留文件的扩展属性信息
- -t:不展开tar,查看归档了哪些文件
- -zcf:既归档又压缩(gzip)
- -zxf:解压(gzip)及展开归档
- -jcf:bzip2
- -jxf:
- -Jcf:xz
- -Jxf:
- zip:可以压缩目录,既归档又压缩
- cpio:归档工具,与tar类似
- read NAME。。。:交互式,给NAME赋值
- -p “PROMPT”:给出提示,
- -t #:超时
- 脚本编程:while循环
- 适用于循环次数未知的场景
- while [ CONDITION ]; do
- statement 。。。
- done