os_lab0笔记


操作系统lab0

1.Linux操作

1.1 查看文件

ls
用法: ls [选项]… [文件]…
选项(常用):
-a 不隐藏任何以 . 开始的项目
-l 每行只列出一个文件

示例:ls -al

1.2 创建一个新的空文件

touch
用法: touch [选项]… 文件…

示例:touch hello_world.c成功创建一个新的文件

1.3 (创建并打开一个文件)

vim [文件名]

1.4 创建文件目录

mkdir
用法:mkdir [选项]… 目录…

示例:mkdir newdir在目录下创建了一个名为newdir的目录

1.5 进入目录

cd
用法:cd [目录]

示例:cd newdir进入newdir目录,cd ..返回上一级目录,cd返回主目录,cd -返回上一次所在的目录
输入pwd可以查看当前所在的绝对路径。

1.6 删除一个空目录

rmdir
用法:rmdir [选项]… 目录…

示例:rmdir newdir删除newdir目录

1.7 删除

rm
用法:rm [选项]… 文件…
选项:
-r 递归删除目录及其内容
-f 强制删除。忽略不存在的文件,不给出提示

示例:rm -rf newdir删除newdir目录及其内容

rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删
除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。 rm命令还有-i选项,这个选项在使用文
件扩展名字符删除多个文件时特别有用。使用这个选项,系统会要求逐一确定是否要删除。这时,必须输入Y并
按回车键,才能删除文件。 示例:rm -rf /-可强制递归删除全盘文件!!!

可以考虑在家目录下创建回收站目录,删除文件时先移动到回收站,再删除

1.8 复制文件

cp
用法:cp [选项]… 源文件 目标文件
选项:
-r 递归复制目录及其内容

示例:cp hello_world.c hello_world2.c复制hello_world.c文件为hello_world2.c
该命令的第一个参数为原文件路径,命令的第二个参数为目标文件路径。如果目标文件路径不存在,则会创建一个新的文件。

1.9 移动文件

mv
用法:mv [选项]… 源文件 目标文件
选项:
-i 若目标文件已经存在,询问是否覆盖

示例:mv hello_world2.c newdirhello_world2.c移动到newdir目录下
mv oldname newname可以重命名文件

1.10 回显

echo

示例:echo "hello world"输出hello world

1.11 查看文件内容

cat
用法:cat [选项]… [文件]…
选项:
-n 显示行号
-b 显示行号,空行不显示
-A 显示所有字符,包括控制字符
-E 显示行尾的$
-T 显示制表符
-v 显示不可见字符
-s 合并多个空行为一个空行
-e 显示行尾的$

示例:cat hello_world.c查看hello_world.c文件内容
cat -n file1 > file2 将file1的内容输出到file2中,并且在每一行前加上行号
cat -b file1 file2 >> file3 将file1和file2的内容输出附加到file3中,并且在每一行前加上行号

### 1.12 帮助

man -manual
用法:man [选项]… [命令]…
选项:
-f 显示命令的简短说明

示例:man ls查看ls命令的帮助
通过man命令可以查看命令的详细用法和参数说明

1.13 查找

find
用法:find [选项]… [路径]… [表达式]…
选项:
-name 按文件名查找
-type 按文件类型查找
-size 按文件大小查找
-exec 对查找到的文件执行命令

  • find当前目录下递归查找符合参数所示文件名的文件,并将文件的路径输出至屏幕上

示例:find . -name "hello_world.c"查找当前目录下的hello_world.c文件

grep
用法:grep [选项]… 模式 [文件]…
选项:
-n 显示行号
-v 显示不包含模式的行
-i 忽略大小写
-r 递归查找
-l 只显示文件名
-c 显示匹配行数
-w 匹配整个单词
-A 显示匹配行及后面的n行

  • grep使用正则表达式匹配文件内容,并把匹配的行输出至屏幕上。可以从文件中查找包含pattern部分字符串的行,并将该文件的路径和该行输出值屏幕

示例:grep "hello" hello_world.c查找hello_world.c文件中包含hello的行

tree
用法:tree [选项]… [目录]…
选项:
-d 只显示目录
-L 显示目录的深度
-a 显示所有文件
-f 显示完整路径

  • tree可以以树状图的形式显示目录结构

示例:tree显示当前目录的树状图

1.14 权限

chmod
用法:chmod [选项]… 模式 文件…
选项:
-R 递归修改
模式:
u 用户
g 用户组
o 其他用户
a 所有用户
‘+’ 添加权限
‘-’ 减少权限
= 设置权限
r 读权限
w 写权限
x 执行权限
s 设置用户ID
t 粘滞位

示例:chmod u+x hello_world.chello_world.c文件的用户添加执行权限
chmod 777 hello_world.chello_world.c文件的所有用户添加读写执行权限
chmod 755 hello_world.chello_world.c文件的用户添加读写执行权限,用户组和其他用户添加读执行权限(对应二进制111b=7, 101b=5)
chmod -w hello_world.c删除hello_world.c文件的写权限

chown
用法:chown [选项]… 用户:用户组 文件…
选项:
-R 递归修改
用户:文件的所有者
用户组:文件的所属用户组
文件:要修改的文件
该命令可以修改文件的所有者和所属用户组

示例:chown root:root hello_world.chello_world.c文件的所有者和所属用户组修改为root

1.15 比较文件差异

diff
用法:diff [选项]… 文件1 文件2
选项:
-c 以上下文的方式显示差异
-u 以统一的方式显示差异
-r 递归比较目录
-b 忽略空格
-B 忽略空行
-q 只显示是否有差异

该命令可以比较两个文件的差异

1.16 文件处理

sed
用法:sed [选项]… [脚本]… [文件]…
选项:
-n 安静模式,只显示脚本处理后的结果
-e 多个脚本处理
-f 从文件中读取脚本
脚本:

  • s/old/new/g 替换old为new
  • d 删除匹配行
  • p 打印匹配行
  • a 在匹配行后添加
  • i 在匹配行前添加
  • c 替换匹配行
  • r 从文件中读取
  • w 写入文件
  • q 退出

-i 直接修改文件,而不是输出到屏幕。否则,只输出不编辑

示例:sed -i 's/old/new/g' hello_world.chello_world.c文件中的old替换为new

[行号]a[内容] 新增,在行号后新增一行相应内容。行号可以是“数字”,在这一行之后新增,也可以是“起始行,终止行”,在其中的每一行后新增。当不写行号时,在每一行之后新增。使用$表示最后一行。后面的命令同理
[行号]c[内容] 取代。用内容取代相应行的文本
[行号]i[内容] 插入。在当前行的上面插入一行文本
[行号]d 删除当前行的内容
[行号]p 输出选择的内容。通常与选项-n一起使用
s/re/string 将 re(正则表达式)匹配的内容替换为 string

示例

sed -i '1a\hello' hello_world.c   #在第一行后添加hello
sed -i '1,3d' hello_world.c      #删除第一行到第三行
sed -i '1,3p' hello_world.c     #输出第一行到第三行
# 输出 my.txt 的第三行
sed -n '3p' my.txt
# 删除 my.txt 文件的第二行
sed '2d' my.txt
# 删除 my.txt 文件的第二行到最后一行($ 符号表示到最末尾)
sed '2,$d' my.txt
# 在整行范围内把 str1 替换为 str2
# 如果没有 g 标记,则只有每行第一个匹配的 str1 被替换成 str2
sed 's/str1/str2/g' my.txt
# -e 选项允许在同一行里执行多条命令。例子的第一条是第四行后添加一个 str, 第二个命令是将
str 替换为 aaa。命令的执行顺序对结果有影响。
sed -e '4a\str' -e 's/str/aaa/' my.txt

awk
用法:awk [选项]… [脚本]… [文件]…
选项:
-F 指定分隔符
脚本:

  • print 打印
  • printf 格式化打印
  • NR 行号
  • NF 列数
  • $1 第一列
  • $0 整行
  • $NF 最后一列
  • $NR 最后一行
  • BEGIN{…} 开始时执行
  • END{…} 结束时执行
  • FS 分隔符
  • OFS 输出分隔符
  • RS 输入行分隔符
  • ORS 输出行分隔符
  • FILENAME 文件名
  • FNR 当前文件的行号
  • ARGIND 当前文件的序号
  • ARGV 当前文件的名字
  • ENVIRON 环境变量
  • length() 字符串长度
  • substr() 截取字符串
  • index() 查找字符串
  • match() 匹配字符串
  • split() 分割字符串
  • tolower() 转小写
  • toupper() 转大写
  • system() 执行系统命令
  • getline 读取下一行
  • close 关闭文件
  • delete 删除数组
  • next 跳过当前行
  • exit 退出

-f 从文件中读取脚本
-v 定义变量

示例

awk '{print $1}' my.txt  #输出 my.txt 的第一列 
awk -F: '{print $1}' /etc/passwd  #以:为分隔符输出/etc/passwd的第一列
awk '{print $1,$2}' my.txt  #输出 my.txt 的第一列和第二列
awk '{print $1,$2}' OFS=":" my.txt  #输出 my.txt 的第一列和第二列,以:为分隔符
awk '$1>2 {print$1,$3}' my.txt  #输出 my.txt 的第一列大于2的行的第一列和第三列
$n 代表每一行中用空格分隔后的第n项
awk -F , '{print $2}' my.txt  #以,为分隔符输出 my.txt 的第二列

1.17 压缩解压

tar
用法:tar [选项]… [文件]…
选项:
-c 创建压缩文件
-x 解压文件
-z 使用gzip压缩
-j 使用bzip2压缩
-v 显示详细信息
-f 指定文件名
-C 指定目录
-t 显示压缩文件内容
-r 向压缩文件中添加文件
-u 更新压缩文件
-d 从压缩文件中删除文件
-A 合并压缩文件
-W 确认压缩文件
-p 保留文件权限
-P 保留绝对路径
-m 不保留文件修改时间
-l 保留符号链接
-k 保留已存在文件
-N 指定时间
-X 指定排除文件
-T 指定文件列表
-U 更新压缩文件
-M 多卷压缩文件
-h 显示帮助

示例

tar -cvf file.tar file1 file2  #将file1和file2打包成file.tar
tar -xvf file.tar  #解压file.tar
tar -zcvf file.tar.gz file1 file2  #将file1和file2打包成file.tar.gz

1.18 管道

管道符号|可以将一个命令的输出作为另一个命令的输入

command1 | command2 | command3

示例

ls -al | grep "hello"  #查找当前目录下包含hello的文件
# 为将my.sh的内容输出给grep命令,grep在其中查找字符串
cat my.sh | grep "Hello"
# 将 my.sh 的内容作为 cat 命令参数,cat 命令 stdout 发给 grep 命令的 stdin,grep 在其
中查找字符串,最后将结果输出到 output.txt
cat < my.sh | grep "Hello" > output.txt

1.19 重定向

  • 标准输入(stdin):0
  • 标准输出(stdout):1
  • 标准错误(stderr):2

重定向符号>可以将命令的输出重定向到文件中
重定向符号>>可以将命令的输出追加到文件中
重定向符号<可以将文件的内容作为命令的输入
重定向符号2>可以将错误输出重定向到文件中
重定向符号&>可以将标准输出和错误输出重定向到文件中
重定向符号2>&1可以将错误输出重定向到标准输出中
重定向符号&>>可以将标准输出和错误输出追加到文件中
重定向符号2>&1可以将错误输出重定向到标准输出中
重定向符号&>>可以将标准输出和错误输出追加到文件中
重定向符号2>&1可以将错误输出重定向到标准输出中

1.20 环境变量

环境变量是一些系统的配置信息,可以通过环境变量来控制系统的行为

  • PATH环境变量:用于指定系统的可执行文件的路径
  • HOME环境变量:用于指定用户的家目录
  • USER环境变量:用于指定当前用户的用户名
  • SHELL环境变量:用于指定当前用户的shell
  • PWD环境变量:用于指定当前用户的工作目录
  • LANG环境变量:用于指定当前用户的语言
  • TERM环境变量:用于指定当前用户的终端类型
  • EDITOR环境变量:用于指定当前用户的编辑器
  • PS1环境变量:用于指定当前用户的命令提示符
  • PS2环境变量:用于指定当前用户的命令提示符的续行符
  • PS3环境变量:用于指定当前用户的选择提示符
  • PS4环境变量:用于指定当前用户的调试提示符
  • HISTSIZE环境变量:用于指定当前用户的历史记录的大小
  • HISTFILESIZE环境变量:用于指定当前用户的历史记录文件的大小
  • HISTCONTROL环境变量:用于指定当前用户的历史记录的控制
  • HISTIGNORE环境变量:用于指定当前用户的历史记录的忽略

export命令可以将一个变量导出为环境变量
unset命令可以将一个环境变量删除
env命令可以查看当前的环境变量
set命令可以查看当前的所有变量
echo $变量名可以查看变量的值
echo $PATH可以查看PATH环境变量的值

1.21 常用快捷键

  • Ctrl+C中断当前命令
  • Ctrl+D退出当前shell,相当于exit
  • Ctrl+L清屏
  • Ctrl+Z挂起当前命令,使用fg命令恢复

1.22 通配符

  • *匹配任意多个字符,ls *.txt匹配所有以.txt结尾的文件
  • ?匹配一个字符,ls ?.txt匹配所有以一个字符加.txt结尾的文件
  • []匹配指定范围内的字符,ls [a-z].txt匹配所有以一个小写字母加.txt结尾的文件
  • !取反,排除匹配的文件,ls !(*.txt)匹配所有不以.txt结尾的文件
  • {},ls {*.txt,*.c}匹配所有以.txt.c结尾的文件
  • ()可以改变优先级,ls (a|b).txt匹配所有以a.txtb.txt结尾的文件
  • |或,ls a.txt|b.txt匹配所有以a.txtb.txt结尾的文件
  • ^匹配行首,ls ^a.txt匹配所有不以a.txt开头的文件
  • $匹配行尾,ls a.txt$匹配所有以a.txt结尾的文件
  • \<匹配单词开头,\>匹配单词结尾,ls \<a.txt匹配所有以a.txt开头的文件
  • **,递归匹配,ls **/*.txt匹配所有以.txt结尾的文件

1.23 tmux

tmux是一个终端复用工具,可以在一个终端中同时运行多个终端
详情看另一个文件

2. 使用工具

2.1 编译器

  • gcc是一个C语言编译器
  • g++是一个C++语言编译器
语法:gcc [选项]... [文件]...
选项:
-c 仅编译,不链接
-o 指定输出文件
-E 预处理
-S 汇编
-l 指定库文件
-L 指定库文件路径
-I Path/to/head/file 指定头文件路径
-D 定义宏
-wall 显示所有警告
-g 生成调试信息
-std=c99 指定C语言标准
参数:
file.c 源文件

示例

gcc -o hello_world hello_world.c  #编译hello_world.c文件为hello_world可执行文件
gcc -c hello_world.c  #编译hello_world.c文件为hello_world.o目标文件
gcc -E hello_world.c  #预处理hello_world.c文件
gcc -S hello_world.c  #汇编hello_world.c文件
gcc -o hello_world hello_world.c -lm  #编译hello_world.c文件为hello_world可执行文件,并链接数学库

同时编译多个文件

gcc -o hello_world hello_world.c hello_world2.c  #编译hello_world.c和hello_world2.c文件为hello_world可执行文件
gcc -c hello_world.c hello_world2.c  #编译hello_world.c和hello_world2.c文件为hello_world.o和hello_world2.o目标文件

选项-o用于指定要生成的结果文件,后面跟的就是结果文件名字。o是output的意思,不是目标的意思。结果文件可能是预处理文件、汇编文件、目标文件或者最终可执行文件。

Makefile

Makefile是一个用于编译程序的工具,可以自动化编译程序
基本格式

target: dependencies
    command 1
    command 2
  • target是要生成的目标文件
  • dependencies是生成target所需要的依赖文件
  • command是生成target所需要执行的命令

示例

hello_world: hello_world.c
    gcc -o hello_world hello_world.c

shell脚本

shell脚本是一个用于执行命令的脚本文件

  • 在脚本中在第一行添加#!/bin/bash可以指定脚本使用的shell
  • 运行脚本
    • 通过chmod +x script.sh添加执行权限后,./script.sh运行脚本
    • sh script.sh运行脚本
    • ./script.sh运行脚本
    • source script.sh运行脚本
  • 参数
    • $0脚本名
    • $1第一个参数
    • $2第二个参数
    • $#参数个数
    • $*所有参数,所有参数都是一个字符串
    • $@所有参数,每个参数都是一个独立的字符串
    • $$脚本的进程号
    • $?上一个命令的返回值
    • $!后台运行的最后一个进程的进程号
  • 函数
    • function_name(){...}定义函数
    • function_name调用函数
    • return返回值
  • 控制结构
    • if...then...fi条件语句
    • case...esac多条件语句
    • for...do...done循环语句
    • while...do...done循环语句
    • until...do...done循环语句
    • break跳出循环
    • continue跳过本次循环
    • exit退出脚本
    • trap捕获信号
    • eval执行命令
    • exec执行命令
    • let执行算术运算
    • select选择语句
    • shift移动参数
    • source执行脚本
    • test测试语句
    • time计时
    • type查找命令
    • ulimit设置资源限制
  • 关系运算符
    • -eq等于
    • -ne不等于
    • -gt大于
    • -lt小于
    • -ge大于等于
    • -le小于等于
    • =字符串相等
    • !=字符串不相等
    • -z字符串为空
    • -n字符串不为空
    • -e文件存在
    • -f文件存在且是普通文件
    • -d文件存在且是目录
    • -s文件存在且不为空
    • -r文件存在且可读

ctags

ctags是一个用于生成代码索引的工具

  • ctags -R生成当前目录的代码索引
  • ctags -R /path/to/dir生成指定目录的代码索引
  • ctags -R /path/to/dir/*生成指定目录的代码索引
  • vim 下使用Ctrl+]跳转到定义处,Ctrl+t返回
  • vim 下使用:ts查找定义处,:tn下一个,:tp上一个

Git

3.1 基本操作

  • git init初始化一个仓库
  • git clone克隆一个仓库
  • git add添加文件到暂存区
  • git commit提交文件到仓库
  • git status查看仓库状态
  • git diff查看文件差异
  • git log查看提交日志
  • git reset重置仓库
  • git rm删除文件
  • git mv移动文件
  • git branch查看分支

3.2 分支操作

  • git branch查看分支
  • git checkout切换分支
  • git merge合并分支
  • git rebase变基分支
  • git cherry-pick挑选提交
  • git tag标记提交
  • git stash暂存工作区
  • git fetch获取远程分支
  • git pull拉取远程分支
  • git push推送远程分支
  • git remote管理远程仓库
  • git submodule管理子模块
  • git worktree管理工作树
  • git reflog查看引用日志
  • git bisect二分查找
  • git blame查看文件作者
  • git grep查找文件内容
  • git log查看提交日志
  • git show查看提交详情

3.3 高级操作

  • git filter-branch过滤分支
  • git subcommand子命令
  • git rerere重用冲突解决
  • git gc垃圾回收
  • git fsck检查仓库
  • git prune删除无用对象

git 版本回退

  • git reset --hard HEAD^回退到上一个版本
  • git reset --hard HEAD^^回退到上上一个版本
  • git reset --hard HEAD~100回退到上100个版本
  • git reset --hard commit_id回退到指定版本
  • git reflog查看命令历史
  • git reset --hard commit_id回退到指定版本
  • git reset --hard HEAD@{n}回退到指定版本
  • git reset --hard ORIG_HEAD回退到上一个版本
  • git reset --hard回退到上一个版本

配置

  • git config --global user.name "Your Name"设置用户名
  • `git config --global user.email "
  • git config --global core.editor "vim"设置编辑器
  • git config --global merge.tool "vimdiff"设置合并工具
  • git config --global color.ui true设置颜色
  • git config --global alias.st status设置别名
  • git config --global alias.co checkout设置别名
  • git config --global alias.ci commit设置别名
  • git config --global alias.br branch设置别名
  • git config --global alias.unstage "reset HEAD"设置别名

文章作者: hugo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hugo !
  目录