Unix/Linux操作系统
写在前面,这里面的东西基本上都是考点,但是我注重于后半部分大家都不太了解的部分写的。
如果没有学过的话,可以先看老师的PPT学一遍,然后考前看我的巩固一下。
这个修订了两次,
一次是我自己复习完,写的;
另一次是期末考完我写的。
1 文件系统
磁盘组织
UNIX中的文件类型
普通文件
目录文件
特殊文件
目录详述
这一部分没有写bash文件的部分,大家可以自己学习补充,考试和作业题中都有出现过。
- 提供了磁盘组织文件的结构
- 目录的层次形式组织→层次目录结构类似倒着生长的shu
- /bin 存放着用户使用的可执行文件
- /sbin 存放着Administrator可以执行的系统管理命令
- /lib /lib64存放着函数库和模块文件
- /boot Linux系统启动时用到的文件 /boot/cmlinuz-内核文件
- /grab启动配置文件
- /dev 存放设备文件
- /mnt /media 用于挂载其他文件系统
- /proc 临时存放的OS文件系统
- /root 管理员root的主目录
- /home 存放所有普通用户主目录
- /etc存放配置文件
- /usr 存放应用程序
- /opt 存放第三方文件
- /var 存放经常变动的文件
- /run 临时文件系统
- /tmp 存放应用程序产生的临时文件
- /sys 存放内核数据信息
- /srv 存放系统提供的内核程序
工作目录
路径
-
绝对路径 /…/…/
-
相对路径 ./…/…
易错题:
设置了HOME=“home/davaid/bin"执行了这条命令后,再次执行pwd命令显示的是什么?
还是"home/davaid/bin”
路径中的特殊符号
. 表示当前路径中的特殊符号
… 表示父目录
- 文件和目录命名的大小写敏感
目录命令
- tree -L 1 / 显示根目录下第一层的目录
- pwd 显示当前工作目录
$ pwd /home/david
-
cd 改变工作目录
cd ~ 进入当前用户主目录
cd ~ tux进入用户tux的主目录 其中的~是进入的权限
su - 直接进入root用户的主目录/root了
-
mkdir 创建目录
若是 mdfir -p xx/yy/zz创建多层目录
-
rmdir remove directory用法同上,但是删除的时候会安全检查和删除多级目录的时候不用-p选项
-
ls 显示指令目录内容
- -l 以长格式显示文件详细信息
- 目录文件蓝色,文本文件黑色
-
长格式显示文件文件详细信息
- 文件格式第一列:文件前面的名字中,组内的2-4表示所有者,5-7表示的组用户,8-10表示其他人
- r w x权限不同,-表示无权限
- 第二列 文件的链接数
- 第三列表示文件的所有者
- 第四列文件所属的组
- 第五列表示文件的大小
- 第六列文件上次修改时间
- 第七列表示文件的名字
- 文件格式第一列:文件前面的名字中,组内的2-4表示所有者,5-7表示的组用户,8-10表示其他人
-
-a 查看隐藏文件
显示文件内容
删除文件
Shell重定向
shell重定向操作符完成的任务
- 使文件作为命令的输入
- 命令输出保存到文件中
输出重定向
将用户命令输出重定向,允许用户将命令的输出保存到文件中,而不是显示在标准输出设备上
符号:> ,>>
命令格式:
command >filename 覆盖重定向
command >> filename 追加重定向
输入重定向
符号:< <<
command < filename 命令行中使用(考点,两个有什么区别)
command << 分节符 脚本编程中使用
cat命令
-
使用 cat命令和输出重定向可以创建文件
cat > myFirst
Hello world
I am tux
study hard
-
文本追加输入
cat >> filename
-
cat命令加输出重定向可以复制文件
cat filea fileb >filec 可以把两个文件复制并添加在一起
文件操作命令
文件操作
创建目录 mkdir
创建文件 vi 和cat
删除文件和目录 rm 和rmdir
命令通用格式 command source target
复制文件
-
cp file1 file2
file2是file1的副本
-
cp 文件名(s) 目录名
把文件复制到其他目录下,可以一次性复制多个文件
-
选项 -i 如果目标文件已经存在,要求确认
-
选项 -r 将目录复制到新的目录下
cp -r ./memos ./david.bak
移动文件
mv命令
-
mv 文件名 目录
支持文件的批量移动
-
mv 文件名1 文件名2
移动并尝试改变文件名
链接命令
ln命令
涉及文件存储的3部分
目录项
inode
数据块
链接文件与复制所得文件的区别
链接文件未创造新的文件
链接文件可以思考为对象的引用
复制文件可以思考为对象的拷贝,有了新的对象
代码格式
-
ln 已有文件名 链接文件名
-
ln 文件名1 文件名2 … 目录
目录中会显示已经链接上的文件名
-
ls -l
可以查看已经链接的文件连接数
都是硬链接,不涉及符号链接(软链接)
字数计算命令wc
wc filename(s)
计算一个或者多个文件的行数,字数和字符数
选项
-l 统计行数
-c 统计字符数
-w 统计字数
示例:ls | wc -w 可以统计有多少个文件
文件名替换
文件操作命令的参数大多为文件
文件通配符:可以使用匹配模式来进行文件匹配
-
?匹配任意单个字符,不是零个
-
*匹配任意字符串,包括空串
-
[list]匹配任意在list中的字符 [1-3][ab]
其中第一个代表匹配1,2,3;第二个代表匹配a或者b
-
[!list]匹配任意不在list中的字符
其他文件操作命令
查找文件 find命令
find 路径名 搜索选项 动作选项
- 搜索选项
- -name 根据文件名查找
- -size±n 根据文件大小查找
- -type 根据文件类型查找 b:块特殊设备文件 c:字符特殊设备文件 d:目录文件 f:普通文件
- -atime ±n根据最后访问日期查找
- -mtime±n根据最后修改日期查找文件
- -newer 查找更新的文件
在查找的过程中,可以使用通配符进行模糊查找
- 动作选项
- -exec command {} ;对找到的文件执行command
- -ok command {} ;在执行command之前要求确认
注意到底是谁需要确定
显示文件的头部 head
head 文件名(s)
选项
-n 显示文件前n行
head -5 Myfile
可以显示多个文件(可以和通配符一起使用)
显示文件尾部的命令
tail 文件名(s)
用法同head
选择文件的一部分cut
cut option filename
option
-f 指定域位置
-c 指定字符位置 就是指定前几个字符输出
-d 指定域分隔字符
连接文件
paste filename1 files filenames
选项:
没有指定连接符的时候,默认是制表符
选项-d,指定连接符的时候,是指定的符号,如 “ ”,:
另一页查看工具
more filename
-lines
+line-number 从第line-number行开始显示
+/pattern 从包含pattern的行上两行开始显示
-c 在显示每页之前清屏
-d 显示提示[press space to continue,’q’ to quit]
space 翻一页
Enter 翻一行
q 退出more
查看工具 less命令
less filename
UNIX系统查找文件
filename→inode节点号→inode节点项→
inode节点项信息→找到文件数据所在的块block→读出数据
正则表达式
使用单个字符串来描述、匹配一系列符合某个句法规则的字符串
通常被用来检索、替换那些匹配某个模式的文本
POSIX标准正则表达式
- [[:alnum:]]匹配一个数字或者字母
- [[:alpha:]]匹配一个字母
- [[:digit:]]匹配一个数字
- [[:upper:]]匹配一个大写字母
- [[:lower:]]匹配一个小写字母
- [[:blank:]]匹配一个空格或者Tab
- [[:print:]]匹配一个可打印字符
正则表达式与通配符的区别
-
- 匹配任意数量的任意字符
- ? 匹配一个任意字符
- [a b]匹配a或者b
- [^a b]匹配除了a b以外的
- [A-Z]匹配一个大写字母
Vi编辑器
-
启动vi编辑器
- vi
- vi filename
-
将指定文件副本插入当前文件光标下一行
- r filenmae
-
将文件的一部分写到另一个文件,覆写
- [a,b] w filebname
-
重排文本指令
-
dd+p
删除当前行,将被删除行放在光标之下
-
dd+P
删除当前行,将被删除行放在光标之上
-
yy+p
复制当前行,将被复制行放到光标之下
-
yy+P
复制当前行,将被复制行放到光标之上
-
-
光标移动指令
- $ 行尾
- 0 行首
- e/w 字首
- b 字首
-
使用删除操作符和域控制符
- d $ 删除光标之后的内容到段尾部
- d 0 删除光标之前的内容到段前
- d w 删除光标之后到单词结束
- 2 d w 删除光标之后的两个单词
- d e 删除光标之后的单词部分
- d b 删除光标之前的单词部分
-
使用复制操作符
- y $复制光标之后的所有文本
- y 0复制光标之前的所有文本
- p置于文本之后
- P置于文本之前
-
使用修改操作符
- c+w 清除指定域文本(一个单词),然后进入文本编辑模式
- c+$清楚指定域文本(一段文字),然后进入文本编辑
-
光标定位
- ctrl d 下翻半页 down
- ctrl u 上翻半页 up
- ctrl f 下翻一页forward
- ctrl b 上翻一页 backward
-
光标移动
- G命令大范围移动光标
- n+G 移动到第n行
- G移动到文件尾
- Ctrl + g获得当前的行号
-
Vi 编辑器的定制
- set all
- set X? 设置xxx的值
打开、保存、关闭文件
- vi filename,打开filename文件
- :w,保存文件
- :w filename,另存为filename
- :q,退出
- :q!,强制退出
- :wq,保存并退出
- ZZ,那是大写的ZZ,表示文件如果没有改动则离开,如果改动则保存并离开
移动光标
命令模式下可以实用以下按键,也可以使用上、下、左、右箭头
- 空格,向右
- baskspace,向左
- 回车,跳转到下一行行首
- ,跳转到上一行行首
- 0,零相当于home建,跳转到行首
- $,相当于end建,跳转到行尾
- ctrl + f,向下翻一页
- ctrl + d,向下翻动半页
- ctrl + b,向上翻动一页
- ctrl + u,向上翻动半页
插入文本或行
- i,在光标的左边插入文本
- I,在光标的行首插入文本
- a,在光标的右边插入文本
- A,在光标的行尾插入文本
- o,在光标的下面新建一行
- O,在光标的上面新建一行
- R,将当前字符替换
- J,合并当前行和下一行
删除或恢复
- x,删除当前光标所在的字符
- nx,删除光标所在字符开始的n个字符
- dd,删除当前行
- ndd,删除当前行开始的n行
- d1G,删除光标行到文件开始
- dG,删除光标行到文件结束
- u,撤销
- U,取消撤销
搜索
- /str,向下搜索str字符串
- ?str,向上搜索str字符串
- &str,只显示匹配到str的行
- n,在搜索时匹配下一个
- N,在搜索时匹配上一个
- esc+n,重复上一次搜索内容,向下匹配
- esc+N,重复上一次搜索内容,向上匹配
跳转至某行
- 100+,向下跳转100行
- 100-,向上跳转100行
- 100G,跳转到100行的位置。
- G,跳转到末尾
- gg,跳转到文件开始,相当于1G
设置行号
- :set nu,显示行号
- :set nonu,取消显示行号
复制、粘贴
- [n]yy,复制当前行。n为数字,如果加了数字表示复制n行
- y1G,复制当前行到文件开始
- yG,复制当前行到文件结束
- [n]yw,从光标开始复制到单词结尾。n为数字,如果加了数字则表示从光标开始复制n个单词,注意是单词,不是字符
- y$,从光标开始复制到行尾
- y^,从光标开始复制到行首
- p,在光标后粘贴
- P,在光标前粘贴
替换
- 😒/old/new,在当前行中把第一个old替换成new
- 😒/old/new/g,在当前行中把所有的old替换成new
- :start,end s/old/new/g,从strart到end行中,所有的old换成new
- :%s/old/new/g[c],将整个文件中的old替换成new,如果出现c则会让用户确认,等同于 :1,$s/old/new
其他
- .,那是小数点,重复上一个动作
- :e otherfilename,编辑另一个文件
- :! commond,暂时退出vi并执行另一个命令,如:!ls /home
- :set fileformat=unix,将文件类型修改为unix下(windows下的文本在linux下会出现^M)
UNIX程序开发
1 GCC vs g++
gcc GNU C 编译器
g++ GNU C++编译器
- 预处理(.i)→编译(.s)→汇编(.o)→链接(可执行文件)
- 命令格式 : gcc [option] filename
-
options
-
c 只进行前三步骤
-
o 指定生成的可执行程序名,缺省的时候,生成的是a.out
gcc -o hello hello.c
-
-
执行
- ./a.out
-
2 重定向文件的输出
- 1>文件描述符,默认分配给标准输出设备
- 2>文件描述符,分配给标准错误输出设备 将出错信息重定向到文件中
3 make 工具
- 用于编译同一项目中众多相互关联的源代码文件
- 解决的问题
-
将代码维护命令及编译命令写在makefile文件中,利用make工具解析此文件自动执行相应命令
-
较少重复编译时间
只对改动文件进行重新编译
-
重新链接所有的目标文件,节省编译时间
-
- make若没有指定目标,默认实现makefile文件的第一个目标,然后退出
4 Shell编程
-
用于编程的命令语言:无需编译
-
shell程序文件:shell过程/shell脚本
-
shell执行:
- sh shellname
- ksh shellname
- bash shellname
这三种是启动一个新shell运行脚本程序
- ./shellname
-
脚本→可执行文件
- chmod 字符串 文件名
-
字符串:对象+操作符+权限
u g o a + - = r w x -
-
- chmod 字符串 文件名
-
退出shell
- exit
- Ctrl-d
-
. 命令
在当前shell中执行脚本,不创建子进程
. .bash_profile
5 echo使用转义字符
- \b 退格
- \c 在输出串尾并不产生新行
- \n 回车并产生一个新行
- \r 回车但不产生新行
- \t 制表符
- \0n 0后面加1-3位八进制数字,代表字符的ASCII码
6 shell编程规则
-
输出替换
echo Your current dirctory : ‘pwd’
-
读取命令read
read A B C
读取的变量数多余变量数目的时候,最后不匹配的都会读入最后一个变量
-
注释 #
-
shell自定义变量
- 变量名 = 变量值
- shell中变量的值都是字符串
- 需要符合命名规则
-
变量声明周期
- 默认:保存到脚本结束
- unset:直接销毁
-
显示变量的值
- echo $name
-
命令行参数
- 最多读取10个命令行参数存入特殊变量
- 按照顺序命名为:$0 $1 $2…$9
- $#命令行参数的个数
- $@所有命令行参数
- $?最后一个命令的退出状态
- $*所有命令行参数
- $$正在执行的PID
-
exit命令
- exit n n是退出状态返回码
-
条件控制结构
-
if-then
if[ condition ] #条件前后必须加空格 then commands ... last-command fi
-
if -then -else
-
if-then-elif
-
-
test命令
-
检测参数表达式的真假
-
-a与
-
-o或
-
!非
-
还可以检测文件属性、长度、类型、权限
test -r filename test -w filename test -f filename
-
-
比较运算符
- -eq 相等
- -ne 不相等
- -gt 大于
- -ge 大于等于
- -lt 小于
- -le 小于等于
-
字符串比较
- =
- !=
- -n 是否包含字符
- -z 是否为空串
-
算数运算
- shell没有提供内部运算符
- 调用expr进行整数运算
- *是乘号
- %是取余符号
- let进行整数计算,不可以加空格
- 可以缩写成(( count=count+1 ))形式
shell三种循环
-
for
- for in done按照指定次数执行一系列命令
for variable in list-of-value do commands done
-
seq序列化输出
seq [选项] 尾数 #增量为1
seq[选项]首数 尾数 #增量为1
seq[选项]首数 增量 尾数
-
for i in {首数…尾数}
for i in {首数…增量…尾数}
-
for file in ‘ls dir’
-
while
while [ condition ] #条件为真0就继续循环
do
commands
...
last-commad
done
- until
#条件为假(非0)就继续循环
until [ condition ]
do
commands
…
last-command
done
系统管理
1 文件管理系统
1.1 磁盘分区
-
位于/dev目录
-
命名规则
/dev/xxyn
n:磁盘区号 1-4主分区 5…:逻辑分区
y:磁盘编号,a第一个
xx:设备类型
hd:IDE磁盘
sd:scsi磁盘
vd:虚拟磁盘
-
fdisk对磁盘进行分区
- fdisk /dev/sdb
- fdisk -l查看文件系统分区情况
-
lsblk 列出块设备信息
-
blkid 查看块设备的文件系统类型、LABEL、UUID等信息
-
mkfs 在磁盘分区上创建文件系统
- mkfs [选项] 磁盘分区名
- -t指定创建的Linux文件系统类型
- mkfs [选项] 磁盘分区名
-
mount 挂载磁盘分区
- mount [option] 磁盘分区文件 目录
-
umount 卸载文件系统
- umount 文件系统名
- umount 挂载文件系统的目录名
-
df 列出系统磁盘空间使用情况
- -h 用易读的方式显示
-
du 显示目录和文件占用磁盘块情况
- du 选项 目录文件
- -a 显示目录中目录和文件占用情况
2 文档和压缩文件
-
tar 将一组文件复制到一个文件中
-
tar -cvf tarfilename files/directories
c 创建存档文件
v 显示打包文件信息
f 指定生成存档文件名
-
tar -tvf tarfilename
t 列出存档文件内容
v 显示包中文件详细信息
f 指定存档文件名
-
tar -xvf tarfilename
x 还原被打包文件
-
tar -xvf tarfilename file1
解压包中特定文件
-
-
-
tar本身只打包不压缩
- 打包并压缩:tar -cvzf tzfilename.tar.gz files/dirs
- 解压缩并解包:tar -xvzf tzfilename.tar.gz
-
compres 压缩文件
- -v显示压缩比例
-
uncompress 解压缩文件
3 任务管理
-
at 指定时间执行一个或一组命令
- -l 列出所有at命令提交的作业
- -m 作业完成时,向用户发送确认信息
- -r 从ar调度作业中删除指定的作业号
-
crontab 编辑配置用户自己的定时任务
- crontab [-u user] file
- crontav [-u user] {-l|-r|-e}
- -e 编辑语法
4 用户及文件权限管理
根用户账户:root
- 用户切换 su username
- 升级切换需要密码
- 降级切换不需要密码
系统账户:对系统特定组件进行操作的账户
- 组按性质划分为:系统组和私有组账户
- 不能登录计算机,只是管理权限
- groupadd 创建用户组账户
- groupmod 修改用户组账户
- groupdel 删除用户组账户
普通用户账户:用户使用系统的账号
-
用户管理配置文件
- /etc/passwd 保存账户信息
login-name: password flag: user-ID: group-ID: user-info: directory: default shell
- /etc/shadow 保存用户密码信息
- /etc/group 保存组账户信息
创建用户账户
- useradd 创建用户账户
- 命令语法: useradd [option] username
- u 指定用户组号
- g 指定用户默认组
- s 指定用户的默认shell
修改账户
-
usermod 修改用户账户
-
命令语法:usermod [option] username
-
userdel 删除用户账户
- userdel -r thomson