前言:学习的时候很慢,现在捡起来又感觉有点遗忘,没有过目不忘的能力,那就只能重复啦
一、Linux 常用命令
1. 文件和目录操作
ls - 列出目录内容
bash
ls # 列出当前目录
ls -l # 详细信息(权限、大小、时间)
ls -a # 显示所有文件(包括.开头隐藏文件)
ls -al # 显示所有文件的详细信息
ls -lh # 人性化显示大小(K/M/G)
ls -lt # 按修改时间排序
cd - 切换目录
bash
cd /home/user # 绝对路径
cd ./dir # 相对路径,当前目录
cd .. # 上级目录
cd ../.. # 上上级目录
cd ~ # 回到家目录
cd - # 回到上一个目录
cd / # 回到根目录
pwd - 显示当前路径
bash
pwd # 显示当前绝对路径
mkdir - 创建目录
bash
mkdir dir # 创建单级目录
mkdir -p a/b/c # 递归创建多级目录
mkdir -m 755 dir # 创建并设置权限
rmdir / rm - 删除
bash
rmdir dir # 删除空目录
rmdir -p a/b/c # 删除目录链
rm file.txt # 删除文件
rm -r dir # 递归删除目录
rm -f file # 强制删除(不提示)
rm -rf dir # 强制递归删除(极度危险!)
cp - 复制
bash
cp source dest # 复制文件
cp -r source_dir dest # 递归复制目录
cp -i source dest # 覆盖前提示
cp -p source dest # 保留原属性
mv - 移动/重命名
bash
mv old new # 重命名
mv file /dir/ # 移动文件
mv *.txt /doc/ # 批量移动
touch - 创建文件
bash
touch file # 创建空文件
touch file1 file2 file3 # 批量创建
2. 文件查看
cat - 查看文件内容
bash
cat file # 显示全部内容
cat -n file # 带行号显示
cat file1 file2 > merge # 合并文件
more / less - 分页查看
bash
less file # 分页查看
# less 快捷键:
# 空格 - 下一页,b - 上一页
# /keyword - 搜索,n - 下一个匹配
# g - 回到开头,G - 到末尾,q - 退出
head / tail - 查看首尾
bash
head file # 显示前10行
head -n 20 file # 显示前20行
tail file # 显示后10行
tail -n 20 file # 显示后20行
tail -f file # 实时追踪文件变化(查看日志)
grep - 文本搜索
bash
grep "pattern" file # 在文件中搜索
grep -i "error" file # 忽略大小写
grep -r "TODO" ./ # 递归搜索目录
grep -n "pattern" file # 显示行号
grep -v "pattern" file # 反向匹配
grep -c "pattern" file # 统计匹配行数
grep -A 5 "error" log # 显示匹配行及后5行
grep -B 5 "error" log # 显示匹配行及前5行
# 正则表达式
grep "^Start" file # 以Start开头的行
grep "End$" file # 以End结尾的行
grep -E "error|warning" file # 扩展正则
find - 文件查找
bash
find . -name "*.txt" # 按名字查找
find . -type f # 查找文件
find . -type d # 查找目录
find . -mtime -7 # 7天内修改的文件
find . -size +10M # 大于10M的文件
find . -perm 755 # 权限为755的文件
find . -name "*.tmp" -delete # 删除找到的文件
find . -name "*.c" -exec gcc {} \; # 对每个文件执行命令
3. 权限管理
chmod - 修改权限
bash
# 数字方式
chmod 755 file # rwxr-xr-x
chmod 644 file # rw-r--r--
chmod 600 file # rw-------
chmod -R 755 dir # 递归修改
# 符号方式
chmod u+x file # 用户增加执行权限
chmod g-w file # 组删除写权限
chmod o=r file # 其他设置为只读
chmod a+x file # 所有用户增加执行
chown - 修改所有者
bash
chown user file # 修改文件所有者
chown user:group file # 修改所有者和组
chown -R user:group dir # 递归修改
4. 进程管理
ps - 查看进程
bash
ps # 当前终端进程
ps -ef # 所有进程完整格式
ps aux # BSD格式(更详细)
ps -ef | grep nginx # 查找特定进程
ps aux --sort=-%cpu # 按CPU排序
ps aux --sort=-%mem # 按内存排序
top - 实时进程监控
bash
top # 实时显示进程
top -u user # 只显示特定用户
# top 快捷键:P-按CPU排序 M-按内存排序 k-杀死进程 q-退出
kill - 终止进程
bash
kill PID # 终止进程(SIGTERM)
kill -9 PID # 强制终止(SIGKILL)
kill -15 PID # 优雅终止(SIGTERM)
kill -1 PID # 重新加载配置(SIGHUP)
killall process_name # 杀死所有同名进程
pkill -f pattern # 按模式杀死进程
5. 网络相关
ping - 网络连通测试
bash
ping google.com # 测试连通性
ping -c 4 baidu.com # ping 4次后停止
netstat / ss - 网络状态
bash
netstat -tuln # 查看所有监听端口
netstat -anp # 显示所有连接和进程
ss -tuln # 更快替代netstat
ss -tulnp # 显示进程名
curl - HTTP请求
bash
curl http://example.com # GET请求
curl -I http://example.com # 只查看响应头
curl -X POST -d "data" URL # POST请求
curl -o file URL # 下载文件
wget - 下载工具
bash
wget URL # 下载文件
wget -O file URL # 指定保存文件名
wget -c URL # 断点续传
6. 压缩和解压
tar - 打包/解包
bash
# 创建压缩包
tar -czvf archive.tar.gz dir/ # gzip压缩
tar -cjvf archive.tar.bz2 dir/ # bzip2压缩
tar -cJvf archive.tar.xz dir/ # xz压缩
# 解压
tar -xzvf archive.tar.gz # 解压gzip
tar -xjvf archive.tar.bz2 # 解压bzip2
tar -xJvf archive.tar.xz # 解压xz
# 查看内容
tar -tzvf archive.tar.gz
# 参数说明:c-创建 x-解压 v-显示过程 f-指定文件 z-gzip j-bzip2 J-xz
zip / unzip
bash
zip -r archive.zip dir/ # 创建zip
unzip archive.zip # 解压zip
unzip -l archive.zip # 查看内容
7. 系统信息与环境变量
系统状态
bash
df -h # 磁盘空间
du -sh dir/ # 目录大小
free -h # 内存使用
uptime # 运行时间
uname -a # 系统信息
whoami # 当前用户
hostname # 主机名
date # 当前时间
环境变量(必须掌握)
bash
echo $PATH # 查看PATH
export PATH=$PATH:/new/path # 添加路径
env # 查看所有环境变量
set # 查看所有变量(包括shell变量)
二、Vim 编辑器
1. 三种基本模式
text
┌─────────────┐
│ 普通模式 │ ← 默认进入,用于移动、删除、复制等
└──────┬───────┘
│ i/a/o
↓
┌─────────────┐
│ 插入模式 │ ← 输入文本
└──────┬───────┘
│ ESC
↓
┌─────────────┐
│ 命令模式 │ ← 保存、退出、搜索等
└─────────────┘
2. 光标移动
vim
h 左
j 下
k 上
l 右
0 行首
$ 行尾
^ 行首(非空字符)
gg 文档首
G 文档尾
nG 第n行
:n 第n行
w 下一个单词首
b 上一个单词首
e 当前/下一个单词尾
3. 编辑操作
vim
i 光标前插入
I 行首插入
a 光标后插入
A 行尾插入
o 下一行插入
O 上一行插入
x 删除当前字符
X 删除前一个字符
dd 删除整行
ndd 删除n行
dw 删除单词
d$ 删除到行尾
yy 复制整行
nyy 复制n行
yw 复制单词
p 当前行下粘贴
P 当前行上粘贴
u 撤销
Ctrl+r 重做
. 重复上一次操作
4. 查找和替换
vim
/pattern 向下查找
?pattern 向上查找
n 下一个匹配
N 上一个匹配
:s/old/new 替换当前行第一个
:s/old/new/g 替换当前行所有
:%s/old/new/g 替换全文所有
:%s/old/new/gc 替换全文所有(带确认)
:10,20s/old/new/g 替换10-20行所有
5. 可视模式(批量注释常用)
vim
v 进入可视模式(字符)
V 进入可视模式(行)
Ctrl+v 进入可视模式(块)
# 批量注释(使用Ctrl+v):
Ctrl+v 选中多行 → I → // → ESC
y 复制选中
d 删除选中
> 缩进选中
< 反缩进选中
6. 文件操作
vim
:w 保存
:wq 保存退出
:q! 强制退出
:w filename 另存为
:set nu 显示行号
:set nonu 取消行号
三、GCC/G++ 编译器
1. 编译过程
c
// test.c
#include <stdio.h>
int main() {
printf("Hello World\n");
return 0;
}
bash
# 四个阶段
gcc -E test.c -o test.i # 预处理
gcc -S test.i -o test.s # 编译成汇编
gcc -c test.s -o test.o # 汇编成目标文件
gcc test.o -o test # 链接
# 一步完成
gcc test.c -o test
g++ test.cpp -o test # C++使用g++
2. 常用编译选项
bash
-o file 指定输出文件名
-c 只编译不链接(生成.o)
-g 包含调试信息(用于gdb)
-Wall 开启所有警告
-Wextra 额外警告
-Werror 警告视为错误
-std=c99 使用C99标准
-std=c++11 使用C++11标准
-std=c++14 使用C++14标准
-std=c++17 使用C++17标准
-O0 不优化(默认)
-O1 基本优化
-O2 更多优化
-O3 最高优化
-lm 链接数学库
-lpthread 链接pthread库
-ljsoncpp 链接jsoncpp库
-I/path 添加头文件搜索路径
-L/path 添加库搜索路径
3. 编译示例
bash
# 单文件编译
g++ -Wall -g test.cpp -o test -std=c++17
# 多文件编译
g++ -c main.cpp -o main.o
g++ -c util.cpp -o util.o
g++ main.o util.o -o program -lpthread
# 带调试信息
g++ -g -DDEBUG test.cpp -o test
4. 静态库与动态库
以 add.c 和 add.h 为例:
c
// add.h
#ifndef ADD_H
#define ADD_H
int add(int a, int b);
#endif
// add.c
#include "add.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "add.h"
int main() {
printf("%d\n", add(3, 5));
return 0;
}
静态库(.a)
bash
# 1. 编译目标文件
gcc -c add.c -o add.o
# 2. 创建静态库
ar rcs libadd.a add.o
# 3. 使用静态库
gcc main.c -L. -ladd -o program
动态库(.so)
bash
# 1. 编译位置无关代码
gcc -c -fPIC add.c -o add.o
# 2. 创建动态库
gcc -shared -o libadd.so add.o
# 3. 使用动态库
gcc main.c -L. -ladd -o program
# 4. 运行时指定库路径
LD_LIBRARY_PATH=. ./program
四、GDB 调试器
1. 准备工作
bash
# 编译时加上 -g 选项
g++ -g test.cpp -o test
# 启动gdb
gdb test
gdb test core # 调试core文件
gdb -p PID # 附加到运行中的进程
2. 设置断点
gdb
break main # 在函数main处设断点
break 10 # 在第10行设断点
break file.c:15 # 在file.c的15行设断点
break 10 if i > 5 # 条件断点(i>5时停下)
info break # 查看所有断点
delete 1 # 删除断点1
disable 2 # 禁用断点2
enable 2 # 启用断点2
3. 程序控制
gdb
run # 开始运行
run arg1 arg2 # 带参数运行
continue # 继续运行(简写 c)
next # 单步跳过(不进入函数,简写 n)
step # 单步进入(进入函数,简写 s)
finish # 运行到当前函数返回
until 10 # 运行到第10行
4. 查看状态
gdb
print var # 打印变量值(简写 p)
print *ptr # 打印指针指向的内容
print arr[0]@10 # 打印数组前10个元素
print/x var # 十六进制打印
print/t var # 二进制打印
x/10x addr # 查看10个十六进制字
x/10d addr # 查看10个十进制字
x/10s addr # 查看10个字符串
bt # 查看调用栈(backtrace)
frame 2 # 切换到第2帧
info locals # 查看局部变量
info args # 查看函数参数
5. 调试实例
c
// test.c
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum = add(sum, i);
printf("i=%d, sum=%d\n", i, sum);
}
return 0;
}
GDB 调试过程
bash
gcc -g test.c -o test
gdb test
gdb
(gdb) break main # 在main函数设断点
(gdb) run # 运行程序
(gdb) break add # 在add函数设断点
(gdb) continue # 继续运行
# 第一次循环到add函数
(gdb) info args # 查看参数 a=0, b=1
(gdb) print a # 查看a的值
(gdb) print b # 查看b的值
(gdb) finish # 运行完当前函数,查看返回值
(gdb) print sum # 查看sum的值
(gdb) next # 跳过printf
(gdb) print sum # sum=1
(gdb) continue # 继续下一次循环
# 观察每次循环sum的变化
(gdb) info break # 查看所有断点
(gdb) delete 2 # 删除add函数的断点
(gdb) continue # 程序运行结束
常用调试场景
gdb
# 查看循环变量变化
(gdb) watch i # 观察i的变化
# 条件断点
(gdb) break add if a > 3 # 只在a>3时停
# 查看调用栈
(gdb) bt # 看到main调用了add
# 修改变量值测试
(gdb) set var sum = 10 # 手动修改sum的值
五、Git 版本控制
1. 初始配置
bash
# 设置用户信息
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 查看配置
git config --list
# 别名配置(提高效率)
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
2. 连接远程仓库(完整流程)
第一步:在 Gitee/GitHub 创建仓库
text
1. 登录 gitee.com 或 github.com
2. 点击 "新建仓库" / "New repository"
3. 填写仓库名称,选择公开或私有
4. 创建完成后复制仓库地址
https://gitee.com/yourname/project.git
或
git@gitee.com:yourname/project.git
第二步:本地初始化并关联
bash
# 进入项目目录
cd /path/to/your/project
# 初始化本地仓库
git init
# 关联远程仓库
git remote add origin https://gitee.com/yourname/project.git
# 查看远程仓库
git remote -v
# 拉取远程仓库内容(首次)
git pull origin master --allow-unrelated-histories
3. Git 三板斧(日常提交)
第一板斧:添加文件到暂存区
bash
git add . # 添加所有变更
git add file.txt # 添加单个文件
git add *.c # 添加所有C文件
git add -A # 添加所有变更(包括删除)
第二板斧:提交到本地仓库
bash
git commit -m "feat: 添加新功能"
git commit -m "fix: 修复bug"
git commit -m "docs: 更新文档"
git commit -a -m "message" # 跳过add直接提交(只对已追踪文件)
第三板斧:推送到远程仓库
bash
git push origin master # 推送到master分支
git push -u origin master # 首次推送并建立追踪
git push # 已建立追踪后直接使用
4. 常用操作补充
查看状态和历史
bash
git status # 查看状态
git log # 查看提交历史
git log --oneline # 简洁格式
git log --graph # 图形化显示
分支管理
bash
git branch branch_name # 创建分支
git checkout branch_name # 切换分支
git branch -b branch_name # 创建并切换
git branch -d branch_name # 删除分支
git merge branch_name # 合并分支
拉取更新
bash
git pull origin master # 拉取并合并
git fetch origin # 拉取但不合并
撤销修改
bash
git checkout -- file.txt # 撤销工作区修改
git reset HEAD file.txt # 从暂存区移除
git reset --hard HEAD~1 # 撤销提交(危险!)
六、Makefile 构建工具
1. 基础语法
最简单的 Makefile
makefile
main: test.c
g++ -o main -g test.c -std=c++17
.PHONY: clean
clean:
rm -f main
使用变量和自动变量
makefile
CC = g++
CFLAGS = -Wall -g -std=c++17
TARGET = main
SRCS = test.c
$(TARGET): $(SRCS)
$(CC) $(CFLAGS) -o $@ $^
.PHONY: clean
clean:
rm -f $(TARGET)
多文件编译
makefile
CC = g++
CFLAGS = -Wall -g -std=c++17
TARGET = main
OBJS = main.o util.o
$(TARGET): $(OBJS)
$(CC) -o $@ $^
%.o: %.cpp
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(OBJS) $(TARGET)
2. 实际项目示例
makefile
# 编译器设置
CXX = g++
CXXFLAGS = -Wall -g -std=c++17
# 链接库
LDLIBS = -lpthread -lm
# 目标文件
TARGET = server
SOURCES = main.cpp tcp_server.cpp protocol.cpp
OBJECTS = $(SOURCES:.cpp=.o)
# 主目标
$(TARGET): $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDLIBS)
# 编译规则
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
# 调试版本
debug: CXXFLAGS += -DDEBUG
debug: clean $(TARGET)
# 清理
.PHONY: clean
clean:
rm -f $(OBJECTS) $(TARGET)
# 运行
.PHONY: run
run: $(TARGET)
./$(TARGET) 8080
3. 常用指令说明
| 符号 | 含义 | 示例 |
|---|---|---|
$@ |
目标文件名 | main |
$^ |
所有依赖文件 | test.c |
$< |
第一个依赖文件 | test.c |
$* |
目标的主文件名 | test |
@ |
静默执行(不显示命令) | @echo "Building..." |
总结
| 工具 | 核心用途 | 掌握程度 |
|---|---|---|
| Linux命令 | 系统操作 | 必须熟练 |
| Vim | 代码编辑 | 熟练常用操作 |
| GCC/G++ | 编译构建 | 掌握常用选项 |
| GDB | 调试排错 | 掌握基本调试 |
| Git | 版本控制 | 三板斧+分支 |
| Makefile | 构建自动化 | 能写基础Makefile |
学习建议:
-
命令和 Vim 需要日常练习形成肌肉记忆
-
GCC/G++ 和 Makefile 结合项目实战
-
GDB 重点掌握断点、单步、查看变量
-
Git 先掌握三板斧,再学习分支管理