文章目录:
CLI = Command Line Interface 命令行
基础操作
(1)目录相关操作
1 进入目录:cd [选项] 目录 (change directory)
其中/为根目录,~为当前用户目录,.表示当前目录(目录前面不加/相当于./),..表示上一级目录,-跳转到上一次的目录。
2 查看目录文件: ls [选项] [目录] (list)
选项(常用):
-a 显示隐藏的文件(all)
-l 每行只列出一个文件(long)3 创建目录: mkdir [选项] 目录 (make directory)
4 查看当前绝对路径: pwd [选项] (print working directory)
5 删除空目录:rmdir [选项] 目录 (remove directory)
(2)文件相关操作
Linux系统中不区分文件后缀,所有文件/目录都是文件
1 创建新文件: touch [选项] 文件名
当文件存在时更新文件的时间戳,当文件不存在时创建新文件。
2 删除文件: rm [选项] 文件 (remove)
选项(常用):
-r 递归删除目录及其内容,删除非空目录必须有此选项,否则无法删除。(recursive 递归)
-f 强制删除,不提示用户确认,忽略不存在的目录。(force 强制)
-i 逐一提示用户确认每个将要被删除的文件。(interactive)常用:rm -rf *(清空当前目录,*不包括隐藏文件)
3 复制文件: cp [选项] 源文件 目标路径 (copy)
将源文件(也可以是目录)复制为目标路径对应的文件(如果目标路径是文件)或复制到目标路径(如果目标路径是目录)。
选项:-r 递归复制目录及其子目录内的所有内容 (recursive 递归)
4 移动文件:mv [选项] 源文件 目标路径 (move)
将源文件(也可以是目录)移动为目标路径对应的文件(如果目标路径是文件)或移动到目标路径(如果目标路径是目录)。
选项(常用):
-v 显示详细的操作信息。(verbose 详细输出)
-i 进行交互式操作,在覆盖前询问。(interative)
-u 仅在源文件较新,或目标文件不存在时,才执行移动操作。(update)重命名文件:e.g. mv test.txt text1.txt
5 文件比较:diff [选项] 文件1 文件2 (difference)
选项(常用):
-b 不检查空白字符的不同。(blank)
-B 不检查空行。(Blank lines)
-q 仅显示有无差异,不显示详细信息。(quiet)6 权限设置
chmod +x 文件名权限可以写成类似于755这种,替换+x,比较容易记忆。(读=4,写=2,执行=1;文件所有者-同组用户-其他用户)
7 读取/拼接
cat [选项]... [文件]...,如果不指定文件,则从标准输入读取内容。
cat file.txt # 查看文件内容/输出
cat file1.txt file2.txt # 拼接文件并输出
cat file1.txt file2.txt > newfile.txt # 拼接文件并输出到新文件
cat > newfile.txt # 从标准输入读取并输入到新文件(3)Vim文本编辑器:
vim 文件 ,若文件不存在也会创建。
修改配置:vim ~/.vimrc,可以询问AI做一些配置。例如:
模式
分为三个模式:Normal、Insert、Commend-line。模式切换:
进入插入模式:
i在光标前插入a在光标后插入o在下方新开一行插入
- 回到普通模式:
Esc - 进入命令行模式:普通模式下按
:
基础操作
:w " 保存
:q " 退出
:wq " 保存并退出
:q! " 强制退出不保存移动光标
上面配置set mouse=a可以使用鼠标移动光标。
基础移动
h j k l:左下上右
w: 跳到下一个单词开头
b: 跳到上一个单词开头
e: 跳到单词末尾
行与文件
0: 行首
^: 行首第一个非空字符
$: 行尾
gg: 文件开头
G: 文件结尾
:n: 跳到第 n 行(如 :120)
翻页
Ctrl + f: 下一页
Ctrl + b: 上一页
Ctrl + d: 下翻半页
Ctrl + u: 上翻半页编辑文本
删除
x: 删当前字符
dd: 删整行
dw: 删到下一个单词开头
d$: 删到行尾
修改(删并进入插入)
cw: 改一个单词
cc: 改整行
C: 改到行尾(等价 c$)
插入相关
I: 跳到行首并插入
A: 跳到行尾并插入
O: 在上方新开一行插入复制粘贴
(复制yank 粘贴paste)
yy: 复制当前行
yw: 复制一个单词
p: 在后面粘贴
P: 在前面粘贴
dd 后 p: 相当于剪切并粘贴撤销重做
u:撤销Ctrl + r:重做.:重复上一次修改
(4)查找操作
1 查找文件: find [路径] <选项>
在给定路径下递归地查找文件,输出符合要求的文件的路径。如果没有给定路径,则在当前目录下查找。
选项(常用): -name <文件名> 指定需要查找的文件名。
2 匹配内容搜索: grep [选项] PATTERN FILE
PATTERN是匹配字符串,FILE是文件或目录的路径。
选项(常用):
-a 不忽略二进制数据进行搜索。
-i 忽略大小写差异。
-r 从目录中递归查找。
-n 显示行号。3 文件树:tree [选项] [文件名]
选项(常用):
-a 列出全部文件(包含隐藏文件)。
-d 只列出目录。4 文件处理:sed [选项] 命令 文件
选项:
-n:关闭默认输出,只有显式打印的内容才会显示。
-i:直接修改文件内容,而不是只输出到屏幕。
-e: 执行多条命令
常见命令:
<行号>a\内容:在指定行后追加一行。
<行号>i\内容:在指定行前插入一行。
<行号>c\内容:用指定内容替换该行(或范围行)。
<行号>d:删除指定行。
<行号>p:打印指定行,通常和 -n 一起使用。
s/正则/替换内容/:替换匹配内容,默认每行只替换第一个;加 g 表示全局替换。
说明:
- 行号可以是数字,如 3
- 也可以是范围,如 2,5,不加一边默认代表到开头/结尾
- $ 表示最后一行5 文本分析工具: awk [选项] '条件 { 动作 }' 文件
选项:
-F 分隔符:指定输入字段分隔符。默认用空格或 Tab 分隔。
-v 变量=值:在执行 awk 程序前,先定义变量。
基本结构:
条件 { 动作 }
说明:
- 条件可以省略,省略时表示每一行都执行动作
- 动作可以省略,省略时表示默认输出当前整行
- 条件和动作都可以结合使用
常用内置变量:
$0:当前整行
$1:第 1 列(列指的是按照前面-F分隔符的不同块,默认空格/Tab)
$2:第 2 列
...
$NF:最后一列
NF:当前行的字段数(列数)
NR:当前处理的是第几行
FNR:当前文件中的第几行
FS:输入字段分隔符
OFS:输出字段分隔符
常见用法:
{print}:输出当前整行
{print $1}:输出第 1 列
{print $1,$3}:输出第 1 列和第 3 列
NR==2 {print}:输出第 2 行
NF>=3 {print $1,$3}:输出列数不少于 3 的行的第 1、3 列
$1=="root" {print $0}:输出第 1 列等于 root 的行
BEGIN{动作}:在读入所有内容前先执行
END{动作}:在处理完所有内容后再执行(5)其他操作
man :命令使用说明
唱跳Rap篮球(Ctrl+C):终止程序
Ctrl+Z:挂起程序,恢复程序使用fg [job_spec]
Ctrl+D:终止输入
Ctrl+L:清屏
echo:输出文本,echo [选项] [字符串]
实用工具
(1) GCC
gcc [选项] 源代码文件,用于编译C语言代码。
gcc cxk.c # 编译
./a.out # 运行a.out
# or
gcc -o hello hello.c # -o可以设置生成可执行文件的名字(2)Makefile
make是一个C语言项目构建工具,每次只用重新编译必要的部分,其指导文件为Makefile,表现目标之间的依赖关系和构建方法。
格式:
target: dependencies
command 1 # 前面必须是制表符
command 2
...
command ntarget为这个目标的名称,dependencies为其依靠的目标/文件。每次make编译时递归检查比较目标和依赖文件的时间戳,决定是否重新编译。
如果想要构建target,那么首先要准备好dependencies,接着执行command中的命令,以得到target。
运行:make target / make
因为上述依赖检查都依靠于文件,有一些make里面的“目标”并不是一个文件,为了避免之后目录下出现对应文件而发生检查时的问题,可以在Makefile设置伪目标:.PHONY targets放在任意位置即可,通常把clean设置为一个为目标。
Makefile中的变量都是字符串,且无需引号。赋值语法:<变量名> := <变量值>,访问变量的值:$(<变量名>)。
(3)ctags
一个方便代码阅读的工具,可以进行代码变量跳转。
目录下生成符号名索引文件:ctags -R *
Vim中查看索引:Ctrl+],跳转符号定义处;Ctrl+o/Ctrl+T,返回。
(4) tmux
分窗口程序。
用不明白。。还是老老实实一个一个看吧
启动:tmux
Git使用
软工基础学过了
分为工作区、暂存区、本地库、远程库。
分为四个状态:
- Untracked:文件未被追踪。
- Unmodified:文件未被改动过,或者改动已经都被提交了。
- Modified:文件已修改未被加入暂存区。
- Staged:文件加入暂存区,下次提交就会提交到库中。
常用命令:
本地基本操作:
git init初始化git status查看分支状态,查看工作区、暂存区git add <filename>将指定的文件放入暂存区(可以是.或-A)git restore <filename>撤销工作区文件更改,回到暂存区状态git restore --staged <filename>取消暂存区文件更改git rm --cached <file>删除不想跟踪的文件,并把记录放进暂存区git reset <file>撤销暂存区文件更改,类似于restore --stagedgit reset --hard HEAD^回退到上个版本(可以回退任意版本,加^的数量)
git commit -m <message>把暂存区修改提交到储存库
远程仓库:
git clone <URL>克隆一个已有的储存库到当前目录下。git remote add origin <仓库地址>添加远程仓库,origin是仓库名。git push把本地的commit推送到一个远程仓库git push -u origin 本地分支:远程分支,设置分支绑定
git pull把远程分支下载/合并到本地git pull origin <远程分支名>
git log查看提交日志
分支管理:
git checkout master分支切换git branch <name>基于当前分支的分支创建git branch -D <name>删除分支
git merge dev当前分支与dev合并git reset --hard HEAD~1直接丢弃上一次提交,同时丢掉工作区暂存区修改git revert HEAD反向提交一次,利于与远程提交git rebase master在当前分支下变基到master分支的HEAD上
Shell脚本
运行脚本:bash my.sh,或者,
修改执行权限之后(e.g. 755)再使用./my.sh
语法基础
1 打印输出
echo "hello OS" # 注释使用#号2 变量 :Shell定义变量无需指定类型,赋值等号两边不允许有空格,用$var_name可以获取变量的值。
#!/bin/bash
str="world, hello"
echo $str3 脚本参数: 用于命令/函数参数传递,类似$1、$2,特殊的:$#为传递参数个数,$*为传递的全部参数(字符串),$?表示前一个命令返回值。
4 条件与循环:
if、then(if或elif条件下一行接)、elif、else、fi(结束语块),比较整数的大小(());
#!/bin/bash
if (( $1 > $2 ))
then
echo "first > second"
elif (( $1 < $2 ))
then
echo "first < second"
elif (( $1 == $2 ))
then
echo "first == second"
else
echo "I don't know..."
fiwhile、do、done(结束)
while condition
do
command1
command2
...
done比较大小还可以使用:
5 函数:
函数的定义:
function fun_name() {
body...
return int_value;
}其中
function和()可以省略其中一个。其中返回语句是可选的,函数可以不返回值。int_value是一个[0,255]之间的整数函数调用:
fun_name param1 param2 ... paramN
流、管道、重定向
(1)几种流
- 标准输入:stdin ,由 0表示
- 标准输出:stdout,由 1表示(例如echo指令)
- 标准错误:stderr,由 2表示
标准流是这样的:(即输入来自键盘,输出到屏幕)
键盘 -> stdin -> 命令 -> stdout/stderr -> 屏幕重定向即把标准输入改到别的地方读,标准输出/错误改到其他地方。
(2)输出重定向
「1」 >:把标准输出写到文件里,覆盖原内容
echo hello > a.txt把hello输出重定向到文件a.txt,并覆盖其内容
「2」 >>:与上面不同的是,不覆盖,而是添加到末尾
「3」错误重定向:2> 和 2>>
常用:2>&1,把错误输出 2 重定向到标准输出 1 当前去的地方。
(3)输入重定向
<:把文件内容当做命令标准输入。
(很多命令下,和直接读文件似乎区别不大
(4)管道
管道 = 把前一个命令的标准输出,直接接到后一个命令的标准输入。
命令1 的 stdout --> 命令2 的 stdin




