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] }'