missing semester笔记

shell指令

罗列一些常见的shell指令供翻阅与学习

基本知识

–help和man: 查阅帮助

使用man命令手册查阅命令的详细说明和参数,或者–help

1
2
man ls
ls --help

在程序间创建连接

默认的输入流和输出流分别为键盘和显示屏,但是 < file> file 可以将输入输出重定向到文件;如果要追加,使用 >> ;而使用 | 可以将一个程序的输出和另一个程序的输入连接起来

命令分隔符

  • ;: 无论前面命令是否执行成功,都会执行后面的命令
  • &&: 前面命令执行成功时才执行后面的命令
  • ||: 前面命令执行失败时才执行后面的命令

子命令

用于把一个命令的输出结果作为另一个命令的参数

1
2
echo "共有 $(ls | wc -l) 个文件"
cat $(find . -name "*.log") # 把所有 .log 文件合并显示

执行文件

使用 ./file 即可

相对路径和绝对路径

注意 / 代表系统的根目录;某个路径以 / 开头,则为绝对路径,否则为相对路径; . 表示当前目录, .. 则表示上级目录

关于权限

每个文件或目录都有三类用户的权限:

  • u: 文件所有者
  • g: 文件所属组
  • o: 其他用户
  • a: 所有用户,即u+g+o

每类用户用三个字母表示其权限:

  • r: 读,查看内容
  • w: 写,修改内容
  • x: 执行文件或进入目录
  • -: 不具备此权限

权限可以使用数字法表示,即三种权限代表的数字相加,三个数字分别对应三类用户,其中:

  • r = 4
  • w = 2
  • x = 1

也可以使用字母符号法:

  • +: 添加权限
  • -: 去除权限
  • =: 设置为指定权限

常用的shell指令

ls: 列出目录内容,即里面的文件和文件夹

1
2
3
4
5
6
7
ls              # 简单列出当前目录内容
ls -l # 详细信息(权限、大小、时间等)
ls -a # 显示所有文件,包括以 . 开头的隐藏文件
ls -lh # 详细信息并以可读单位显示文件大小
ls /path # 查看指定路径
ls --color=auto # 彩色打印结果
ls -t # 以最近访问顺序排序

cd: 切换目录

1
2
3
4
cd /home/user    # 切换到指定目录
cd ~ # 切换到当前用户主目录
cd .. # 返回上一级目录
cd - # 回到上一次所在目录

pwd: 显示当前目录的完整路径

mkdir: 创建新目录

1
2
mkdir newdir                 # 创建一个新目录
mkdir -p /tmp/dir1/dir2 # 递归创建多级目录

rm: 删除文件或目录

1
2
3
4
rm file.txt                # 删除文件
rm -r dir # 递归删除目录及其内容
rm -f file.txt # 强制删除,不提示
rm -rf dir # 递归强制删除目录

cp: 复制文件或目录

1
2
3
cp source.txt dest.txt         # 复制文件
cp -r dir1 dir2 # 递归复制目录
cp file1 file2 /some/dir/ # 复制多个文件到目录

mv: 移动或重命名文件或目录

1
2
3
mv old.txt new.txt             # 重命名文件
mv file.txt /new/dir/ # 移动文件到新目录
mv dir1 dir2 /path/ # 移动多个文件/目录

cat: 查看文件内容、合并文件、快速创建文件

1
2
3
cat file.txt                  # 显示文件内容
cat file1 file2 > merged.txt # 合并两个文件为一个新文件
cat > newfile.txt # 创建新文件并输入内容(Ctrl+D结束)

more/less: 分页显示文件内容

1
2
more file.txt
less file.txt

head: 查看文件开头内容

1
2
head file.txt           # 默认显示前10行
head -n 20 file.txt # 显示前20行

tail: 查看文件结尾内容

1
2
3
tail file.txt           # 默认显示后10行
tail -n 20 file.txt # 显示后20行
tail -f log.txt # 实时跟踪文件新增内容

touch: 创建新的空文件,或者更新已存在文件的时间戳

1
2
touch file.txt            # 创建空文件或更新时间戳
touch file1 file2 # 同时创建/更新时间戳多个文件

echo: 输出文本或变量的值

1
2
3
echo "Hello, world!"
echo $HOME
echo "PATH is $PATH"

grep: 根据字符串或正则表达式搜索文本内容

1
2
3
4
5
grep "pattern" file.txt             # 查找文件中包含"pattern"的行
grep -i "pattern" file.txt # 忽略大小写
grep -r "pattern" ./dir # 递归搜索目录
grep -n "pattern" file.txt # 显示行号
grep -v "pattern" file.txt # 反向匹配(不包含 pattern 的行)

sort: 对文件每一行进行排序

1
2
3
4
5
sort file.txt                        # 按字母顺序排序
sort -n file.txt # 按数字排序
sort -r file.txt # 反向排序(降序)
sort -k 2 file.txt # 按第2列排序(默认以空格/制表符分隔)
sort -u file.txt # 排序后去重

uniq: 删除重复行

1
2
3
4
uniq file.txt                        # 去除重复行(需先排序)
sort file.txt | uniq # 先排序再去重
uniq -c file.txt # 统计每个唯一行出现的次数
uniq -d file.txt # 只显示重复的行

awk: 功能多样

1
2
3
4
awk '{print $1}' file.txt            # 打印第一列
awk -F ':' '{print $1, $3}' /etc/passwd # 指定分隔符
awk '$3 > 1000 {print $1}' /etc/passwd # 条件筛选
awk '{sum += $2} END {print sum}' file.txt # 汇总第二列

cut: 按列提取文本

1
2
3
cut -d ':' -f 1 /etc/passwd          # 以 : 为分隔符,提取第1列
cut -c 1-5 file.txt # 提取每行的第1至5个字符
cut -f2,4 -d',' data.csv # 以逗号为分隔符,提取第2和第4列

sed: 流编辑器,批量处理文本内容

1
2
3
4
5
6
7
sed 's/old/new/' file.txt          # 替换每行第一个old为new(s为替换)
sed 's/old/new/g' file.txt # 替换每行所有old为new(s为替换,g为全局)
sed '2d' file.txt # 删除第二行
sed '2,4d' file.txt # 删除第2到4行
sed -n '5,10p' file.txt # 只显示第5到10行
sed '2i\插入内容' file.txt # 在第二行前插入内容
sed '2a\追加内容' file.txt # 在第二行后追加内容

添加 -e 选项以支持多条指令, -E 选项以支持正则表达式

wc: 统计文件内容

1
2
3
wc -l file.txt         # 行数
wc -w file.txt # 单词数
wc -c file.txt # 字节数

diff/cmp: 比较文件差异

1
2
diff file1.txt file2.txt
cmp file1.txt file2.txt

find: 查找文件或目录

1
2
3
find . -name "*.txt"                # 当前目录下查找所有txt文件
find /home -type d -name "test*" # 查找以test开头的目录
find . -size +10M # 查找大于10M的文件

locate: 在系统索引数据库中快速查找文件

1
locate bashrc

使用 updatedb 定期更新数据库

chmod: 修改权限

1
2
3
4
5
6
7
8
9
chmod 777 test.txt         # 所有人全部权限
chmod 644 test.txt # 所有者rw,组/其他r
chmod 600 secret.txt # 只有所有者可读写
chmod +x run.sh # 给所有用户添加可执行权限
chmod -R 755 /path/dir # 递归更改目录及其内容权限
chmod u+x file.sh # 给所有者添加执行权限
chmod go-w file.txt # 移除组和其他用户的写权限
chmod a=r myfile # 所有人只有读权限
chmod u=rw,go=r data.txt # u:读写,g/o:只读

chown: 修改所有者和所属组

1
2
chown user file.txt
chown user:group file.txt

su/sudo: 切换用户/以管理者身份执行命令

1
2
su               # 切换到root用户,需要输入root密码
sudo command # 以root权限执行command

ps: 查看进程

1
2
3
ps                # 查看当前shell的进程
ps aux # 查看所有进程
ps -ef # 另一种详细格式

top/htop: 动态显示系统进程和资源占用情况

kill: 终止进程

1
2
kill PID                # 结束指定进程
kill -9 PID # 强制杀死进程

df: 查看磁盘大小

1
df -h                  # 以可读单位显示磁盘使用情况

du: 查看文件或目录大小

1
2
du -sh *               # 显示当前目录下每个文件/目录的大小
du -h --max-depth=1 # 只显示一级子目录大小

free: 查看内存使用

uname: 显示系统信息

1
2
uname -a                # 显示全部信息
uname -r # 显示内核版本

ping: 测试主机之间的网络连接

1
2
ping www.baidu.com
ping -c 4 www.baidu.com # 只ping 4次

ifconfig/ip: 显示或配置网络接口信息

1
ip a

curl/wget: 从网络获取文件或数据

1
2
curl http://example.com
wget http://example.com/file.txt

history: 查看历史命令

date: 显示或设置系统时间

clear: 清屏

shell脚本

脚本开头:shebang

用于指定解释器

1
!/bin/bash

变量

使用变量时前面加上 $ ;赋值时等号左右不能有空格,否则视为参数;分隔符 ' 中的变量不会被转义,而 " 会将变量值进行替换;$(CMD) 实现命令替换,即用命令的输出进行替换;<(CMD) 则会执行命令并将结果输出到一个临时文件中

获取脚本参数

  • $0: 脚本名
  • $1: 脚本的第一个参数
  • $@: 所有参数(分开)
  • $*: 所有参数(整体)
  • $#: 参数个数
  • $?: 前一个命令的返回值(退出状态)
  • $$: 当前脚本的进程识别码
  • !!: 完整的上一条命令(含参数)
  • $_: 上一条命令的最后一个参数

条件判断

1
2
3
4
5
6
7
if [ condition ]; then
command1
elif [ condition2 ]; then
command2
else
command3
fi

常见条件运算符(整数):

  • -eq: 等于
  • -ne: 不等于
  • -gt: 大于
  • -lt: 小于
  • -ge: 大于等于
  • -le: 小于等于

字符串判断:

  • -z: 字符串为空
  • -n: 字符串非空

文件判断:

  • -e file: 文件存在
  • -f file: 普通文件
  • -d file: 目录

循环

1
2
3
4
5
6
7
8
 for循环
for i in 1 2 3; do
echo $i
done

for file in *.txt; do
echo $file
done
1
2
3
4
5
6
 while循环
count=1
while [ $count -le 5 ]; do
echo $count
count=$((count+1))
done

函数

1
2
3
4
myfunc() {
echo "参数1:$1"
}
myfunc "hello"

使用 source 指令加载函数

vim

懒得看了,待补充,参考指令 vimtutor ,或者vimtutor中文版

正则表达式

参考正则表达式30分钟入门教程

元字符

  • .: 匹配除换行符以外的任意字符,在Singleline模式也会匹配换行符;如果是想查找 . 这个字符本身,请使用转义 \.
  • \w: 匹配字母或数字或下划线,等效于 [A-Za-z0-9_]
  • \s: 匹配任何空白符
  • \d: 匹配数字
  • \b: 匹配单词开头或结束,如 \bhi\b 精确匹配单词hi
  • ^: 匹配字符串的开始,在Multiline模式匹配行首
  • $: 匹配字符串的结束

限定符

  • *: 重复零次或更多次
  • +: 重复一次或更多次
  • ?: 重复零次或一次
  • {n}: 重复n次
  • {n,}: 重复n次或更多次
  • {n,m}: 重复n到m次

注意限定符默认贪婪,即匹配尽可能多的字符,如 a.*b 匹配最长的a开始b结束的字符串;为了懒惰,即匹配尽可能少的字符,在限定符后加上 ? 即可

字符类

使用方括号,如 [aeiou] 匹配任意一个元音字母, [0-9] 等效于 \d

分枝条件

使用 | 匹配多个规则,类似于or,因此也要注意条件顺序

分组

使用圆括号来分组,从而匹配括号里的子表达式,并可以使用限定符约束;在这样做时实现了捕获,正则表达式从左到右为每个分组分配一个组号,后续使用 \1 可以代表分组1的文本(而分组0代表整个正则表达式)

捕获

  • (exp): 匹配exp,并捕获文本到自动命名的组里
  • (?<name>exp): 匹配exp,并捕获文本到名称为name的组里,也可以写成 (?'name'exp)
  • (?:exp): 匹配exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言

(?=exp) 断言自身出现的位置的后面能匹配表达式exp,如 \b\w+(?=ing\b) 匹配以ing结尾的单词的前面的部分(除了ing以外的部分)

  • (?=exp): 匹配exp前面的位置
  • (?<=exp): 匹配exp后面的位置
  • (?!exp): 匹配后面跟的不是exp的位置
  • (?<!exp): 匹配前面不是exp的位置

注释

使用 (?#comment) 写注释

反义

  • \W: 匹配任意不是字母,数字,下划线的字符
  • \S: 匹配任意不是空白符的字符
  • \D: 匹配任意非数字的字符
  • \B: 匹配不是单词开头或结束的位置
  • [^x]: 匹配除了x以外的任意字符

递归匹配

用于判定括号匹配等等,使用了栈的思想

  • (?'group'): 把捕获的内容命名为group,并压入堆栈
  • (?'-group'): 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
  • (?(group)yes|no): 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
  • (?!): 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

命令行环境

终端多路复用

使用 tmux 实现基于面板和标签分割出多个终端窗口,从而同时与多个 shell 会话进行交互

会话

1
2
3
4
5
6
tmux                     # 启动 tmux 并进入默认 session
tmux new -s mysession # 新建并命名一个 session
tmux ls # 列出所有 session
tmux attach -t mysession # 连接/恢复到指定 session
tmux kill-session -t mysession # 关闭指定 session
tmux detach # 分离当前session保持后台运行,也可以使用Ctrl-b d

窗口

  • Ctrl+b c: 新建窗口
  • Ctrl+b n: 下一个窗口
  • Ctrl+b p: 上一个窗口
  • Ctrl+b w 列出窗口列表
  • Ctrl+b ,: 重命名当前窗口

面板

  • Ctrl+b %: 横向分屏(左右)
  • Ctrl+b ": 纵向分屏(上下)
  • Ctrl+b o: 在各面板之间切换
  • Ctrl+b x: 关闭当前面板
  • Ctrl+b ;: 返回上一个面板

别名

使用 alias 指令取个简短的新名字

1
alias alias_name="command_to_alias arg1 arg2"

远端设备

使用 ssh 指令连接到其他服务器

1
2
3
4
5
ssh [user@]hostname [command]
ssh -p 2222 user@host # 连接到2222端口
ssh -i ~/.ssh/id_rsa user@host # 用指定私钥认证
ssh -L 8080:localhost:80 user@host # 本地8080转发到远程80端口
ssh -R 2022:localhost:22 user@host # 远程端口转发

公钥认证

1
2
ssh-keygen -t rsa       # 生成密钥对
ssh-copy-id user@host # 将公钥上传到远程主机

配置文件

即设置 ~/.ssh/config 来简化指令

1
2
3
4
5
Host myserver
HostName server.com
User alice
Port 2222
IdentityFile ~/.ssh/id_rsa

相关指令

1
2
scp file.txt user@host:/tmp/    # 基于ssh的拷贝
tee # 将标准输出写入到一个文件,可以配合ssh使用

git

一些常用指令

日常同步和获取代码

1
2
git clone <address>     # 第一次获取项目代码到本地
git pull # 同步远程仓库最新提交到本地当前分支

代码变更管理

1
2
3
4
git status              # 查看哪些文件发生了变化、哪些文件已暂存、哪些未提交
git add <file name>
git add . # 把更改加入到下次提交的“暂存区”,. 表示全部添加
git commit -m "message" # 把暂存区的更改保存为一次提交

分支管理

1
2
3
4
5
git branch                  # 列出所有本地分支
git checkout -b <feature> # 新建并切换分支
git checkout <feature> # 切换分支
git merge <feature> # 把指定分支的更改合并到当前分支
git branch -d <feature> # 删除已合并或不用的分支

推送与协作

1
2
git push                        # 把本地提交同步到远程仓库
git push -u origin <feature> # 推送新分支到远程,第一次把新分支推送到远程时常用

历史与排查

1
2
3
4
git log                 # 查看项目的提交记录
git log <file name> # 排查某文件的历史修改
git diff # 比较未提交的更改、分支差异等
git stash # 临时保存未提交的更改,切换分支后可恢复

场景举例

1
2
3
4
5
6
7
8
9
git pull                        # 拉取最新代码
git checkout -b <feature> # 新建分支
git add .
git commit -m <message> # 提交
git push -u origin <feature> # 推送分支
pr
git checkout main # 切回主分支
git pull # 同步
git branch -d <feature> # 删除用完的本地分支

missing semester笔记
http://example.com/2025/06/08/missing-semester笔记/
作者
jietiDdd
发布于
2025年6月8日
许可协议