Linux 常用基础指令 + grep/awk/sed + Shell 脚本 + Makefile 知识点汇总。
下载可打印版(Markdown) (浏览器打开后 Ctrl+P 另存为 PDF)
一、Linux 基本常用指令
1. 文件和目录操作
- 查看当前目录
1pwd # 显示当前路径
2ls # 列出当前目录文件
3ls -l # 以长格式显示(权限/用户/大小/时间)
4ls -a # 显示隐藏文件(以 . 开头)
5ls -lh # 以人类可读方式显示文件大小
- 切换目录
1cd /path/to/dir # 进入指定目录
2cd ~ # 回到当前用户家目录
3cd .. # 返回上一级目录
4cd - # 在最近两个目录之间来回切换
- 创建/删除目录
1mkdir test # 创建目录
2mkdir -p a/b/c # 递归创建多级目录
3rmdir emptydir # 删除空目录
4rm -r dir # 递归删除目录(危险)
5rm -rf dir # 强制递归删除(非常危险,慎用)
- 文件操作
1touch file.txt # 创建空文件或更新修改时间
2cp src dest # 复制文件
3cp -r dir1 dir2 # 递归复制目录
4mv old new # 重命名或移动
5rm file.txt # 删除文件
6rm -f file.txt # 强制删除不提示
- 查看文件内容
1cat file # 一次性输出全部
2tac file # 反向输出
3more file # 分页查看(空格下一页,q退出)
4less file # 更强大的分页查看(支持上下翻页、搜索)
5head file # 默认显示前10行
6head -n 20 file # 显示前20行
7tail file # 显示后10行
8tail -n 50 file # 显示后50行
9tail -f logfile # 实时查看文件末尾(看日志)
2. 权限与用户
1ls -l # 查看权限如:-rwxr-xr--
2chmod 755 file # 改权限为 rwxr-xr-x
3chmod u+x file # 给当前用户增加执行权限
4chown user:group file # 修改文件拥有者
权限位说明(以 -rwxr-xr-- 为例):
- 第1位:文件类型(
-普通文件,d目录,l链接) - 后9位每3一组:
r读、w写、x执行- 第1组:所有者
- 第2组:所属组
- 第3组:其他人
3. 进程与系统相关
1ps # 查看当前 shell 相关进程
2ps aux # 查看所有进程
3top # 动态查看系统进程
4
5kill PID # 向进程发送 SIGTERM
6kill -9 PID # 强制杀死进程(SIGKILL)
7
8whoami # 当前用户名
9who # 当前登录用户
10uname -a # 内核和系统信息
11df -h # 查看磁盘使用情况
12du -sh dir # 查看目录大小
13free -h # 查看内存使用
4. 查找与定位
1which cmd # 查看命令路径
2whereis cmd # 查看命令相关文件位置
3find . -name '*.c' # 在当前目录递归查找 .c 文件
4locate filename # 从数据库快速查找(需定期 updatedb)
二、grep 指令(文本搜索)
1. 基本用法
1grep "pattern" file # 在文件中查找包含 pattern 的行
2grep -n "main" *.c # 显示行号,并在所有 .c 文件中查找 main
3grep -i "error" logfile # 忽略大小写
4grep -v "DEBUG" logfile # 反选:不包含 DEBUG 的行
常用选项:
-n: 显示行号-i: 忽略大小写-v: 取反匹配-r: 递归子目录-E: 支持扩展正则(相当于egrep)-o: 只输出匹配部分-c: 只统计匹配行数
2. 正则匹配示例
1# 匹配以 error 开头的行
2grep "^error" logfile
3
4# 匹配以 .c 结尾的行
5grep "\.c$" filelist
6
7# 匹配数字行
8grep "[0-9]" file
9
10# 匹配空行
11grep "^$" file
12
13# 匹配多种关键字(用 -E 或 egrep)
14grep -E "error|warning|fatal" logfile
3. 管道配合使用
1dmesg | grep -i usb # 从内核日志中过滤 usb
2ps aux | grep nginx # 查看 nginx 相关进程
3ls -l | grep "^d" # 仅显示目录(以 d 开头)
三、awk 指令(文本处理 / 小脚本语言)
1. 基本结构
1awk 'pattern { action }' file
字段说明:默认按空白分隔
$1:第1列$2:第2列$0:整行NR:当前行号NF:当前行字段数
2. 常见用法
1# 打印整行
2awk '{ print }' file
3
4# 打印第1列和第3列
5awk '{ print $1, $3 }' file
6
7# 只打印匹配包含 "error" 的行第2列
8awk '/error/ { print $2 }' logfile
9
10# 打印行号和内容
11awk '{ print NR, $0 }' file
12
13# 统计指定列的和,比如第2列是数字
14awk '{ sum += $2 } END { print sum }' data.txt
3. 指定分隔符与条件
1# 以冒号为分隔符(如 /etc/passwd)
2awk -F: '{ print $1, $3 }' /etc/passwd
3
4# 以逗号为分隔符
5awk -F',' '{ print $2 }' data.csv
6
7# 打印第2列大于80的行
8awk '$2 > 80 { print $0 }' score.txt
9
10# 打印第2列在60~80之间的行
11awk '$2 >= 60 && $2 <= 80 { print $1, $2 }' score.txt
12
13# 统计行数
14awk 'END { print NR }' file
四、sed 指令(流编辑器,常用于替换)
1. 基本替换
1sed 's/old/new/' file # 每行只替换第1个 old
2sed 's/old/new/g' file # 每行替换所有 old
2. 就地修改(in-place)
1sed -i 's/old/new/g' file # 直接修改文件
2sed -i.bak 's/old/new/g' file # 修改前备份到 file.bak
3. 常见操作
1# 删除空行
2sed '/^$/d' file
3
4# 删除包含某个关键词的行
5sed '/DEBUG/d' logfile
6
7# 只打印 10~20 行
8sed -n '10,20p' file
9
10# 将每行开头的 # 去掉(取消注释)
11sed 's/^#//' file
12
13# 在匹配行前/后插入内容
14sed '/pattern/i \插入在前一行' file
15sed '/pattern/a \插入在后一行' file
4. 补充:替换范围小抄
s/old/new/:每行只换第一个s/old/new/g:每行全部替换s/old/new/2:只换每行第 2 个s/old/new/2g:从第 2 个开始到行尾都换
按行号:
1sed '5s/old/new/' file # 只改第 5 行
2sed '2,4s/old/new/' file # 只改第 2~4 行
3sed '/int/s/old/new/' file # 只改含 int 的行
五、Shell 脚本编写基础(bash)
1. 基本结构
1#!/usr/bin/env bash
2
3echo "Hello, Shell"
运行:
1chmod +x script.sh
2./script.sh
2. 变量与命令替换
1name="Alice"
2echo "Hello, $name"
3
4now=$(date)
5echo "Now is $now"
注意:赋值号两边不能有空格。
3. 位置参数与特殊变量
1echo "脚本名: $0"
2echo "第1个参数: $1"
3echo "第2个参数: $2"
4echo "参数个数: $#"
5echo "所有参数: $@"
常见:
$#:参数个数$@:所有参数列表$$:当前脚本进程 ID$?:上一条命令的退出状态(0 表示成功)
4. 条件判断
1if [ "$1" -gt 10 ]; then
2 echo "大于10"
3elif [ "$1" -eq 10 ]; then
4 echo "等于10"
5else
6 echo "小于10"
7fi
整数比较:-eq -ne -gt -ge -lt -le
文件测试:-f 普通文件,-d 目录,-e 存在与否。
5. 循环与函数
1# fo r
2for i in 1 2 3 4 5; do
3 echo "$i"
4done
5
6for f in *.c; do
7 echo "处理 $f"
8done
9
10# while
11count=1
12while [ "$count" -le 5 ]; do
13 echo "$count"
14 count=$((count + 1))
15done
16
17# 函数
18myfunc() {
19 echo "参数1: $1"
20 return 0
21}
22
23myfunc "hello"
24echo "函数返回值: $?"
六、Makefile 编写基础
1. 规则格式
1target: dependencies
2 <TAB>command
target:目标(可执行文件 / .o / 伪目标)dependencies:依赖文件command:生成目标的命令(必须 TAB 开头)
2. 简单示例
1app: main.o foo.o
2 gcc -o app main.o foo.o
3
4main.o: main.c foo.h
5 gcc -c main.c
6
7foo.o: foo.c foo.h
8 gcc -c foo.c
9
10clean:
11 rm -f app *.o
使用:
make:默认执行第一个目标(这里是app)make clean:执行清理
3. 变量与自动变量
1CC = gcc
2CFLAGS = -Wall -O2
3
4app: main.o foo.o
5 $(CC) -o $@ $^ $(CFLAGS)
6
7%.o: %.c
8 $(CC) -c $< $(CFLAGS)
$@:当前规则的目标名$<:第一个依赖$^:所有依赖
4. 伪目标
1.PHONY: clean run
2
3clean:
4 rm -f app *.o
5
6run: app
7 ./app
七、综合小例子
1. 统计当前目录所有 .c 文件中包含 TODO 的总行数
1#!/usr/bin/env bash
2
3count=$(grep -r "TODO" --include="*.c" . | wc -l)
4echo "共有 $count 行包含 TODO"
2. 每个文件 TODO 数统计(grep + awk)
1grep -r "TODO" --include="*.c" . \
2| awk -F: '{ file=$1; count[file]++ } END { for (f in count) print f, count[f] }'