Linux常用命令和vim、g++、gdb、git、makefile等工具

前言:学习的时候很慢,现在捡起来又感觉有点遗忘,没有过目不忘的能力,那就只能重复啦

一、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.cadd.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

学习建议:

  1. 命令和 Vim 需要日常练习形成肌肉记忆

  2. GCC/G++ 和 Makefile 结合项目实战

  3. GDB 重点掌握断点、单步、查看变量

  4. Git 先掌握三板斧,再学习分支管理