Skip to content

命令行 101

输入端口杀死进程

bash
kill -9 $(lsof -t -i:1080)

tldr

返回大纲

全称是 "Too Long; Didn't Read",即“太长,不想读”

bash
tldr find

tmux

返回大纲

https://github.com/tmux/tmux

tmux 概念:Session(会话)、Window(窗口)、Pane(面板)

bash
tmux ls

# 脱离会话
Ctrl+B D

# 返回会话
tmux attach -t 0
tmux a -t 0

# 新建会话
tmux new -s Session1

# 新建窗口
Ctrl+B C
# 切换窗口 Next
Ctrl+B N
# 切换窗口 Previous
Ctrl+B P
# 切换窗口 按序号
Ctrl+B (1,2,3)
# 重命名窗口
Ctrl+B ,

# 窗口导航
Ctrl+B W

# 移动光标
Ctrl+B 方向键
# 关闭分屏
Ctrl+B X
# 左右分屏
Ctrl+B %
# 上下分屏
Ctrl+B "

自定义 tmux 状态栏(.tmux.conf)

conf
set -g status-bg cyan
set -g window-status-style bg=yellow
set -g window-status-current-style bg=red,fg=white

https://tmuxcheatsheet.com

git

返回大纲

bash
# commit 合并 add 和 commit
git commit -am "update"

# checkout 首次检出远程分支到本地
git checkout -b <本地分支> origin/<远程分支>

# alias
git config --global alias.ac "commit -am"
git ac "update"

# amend 修正 commit 消息
git commit --amend -m "nick"
git commit --amend --no-edit

# log
git log --oneline --graph -- decorate
## 1. by date: `--before`/`--after`
git log --after="2021-7-1" --before="2021-7-5"
## 2. by msg: `--grep`
git log --grep="refactor"
## 3. by author: `--author`
git log --author="Heinemeier"
## 4. by file: `-- <filename>`
git log -- README.md
## 5. by branch: `<branch-A>`
git log feature/login..main # 在main分支,但不在login分支的提交

# revert
git revert better-day
git revert s2a2309

# stash
git stash
git stash pop
git stash save coolstuff
git stash list
git stash apply 0

# interactive rebase
git rebase -i HEAD~3
git log --oneline

# cherry-picking
git cherry-pick asd12as
git rebase --hard HEAD~1

# reflog 1. 恢复被删 commit 2. 恢复被删分支
git reflog
git branch happy-end a23adsf

# 查看所有远程仓库的地址
git remote -v

tree

返回大纲

目录

sh
# 只显示2层深度
tree -L 2

# 显示3层深度的目录结构,不包含文件
tree -L 3 -d

sort

TODO

uniq

TODO

xargs

返回大纲

把前一个命令的输出转成参数,交给下一个命令用

bash
# 找到名字里有 `tmp` 的文件并删除。
fd tmp | xargs rm -f

# 找所有 `.go` 文件,并统计行数
fd . -e go | xargs wc -l

# 配合 `echo` 验证参数流向
echo "foo bar baz" | xargs -n1

tee

返回大纲

一边输出内容到终端,一边保存一份到文件

sh
#  看 build 结果,还顺手存一份
kustomize build . | tee /tmp/build.yaml

# 应用前手动备份一手
kustomize build . | tee preview.yaml | kubectl apply -f -

heredoc

返回大纲

在 shell 中写多行字符串的语法

sh
# 标准输出
cat <<EOF
兄弟你这发言,像极了成长型人格的典范!
一开口我就感觉你是要起飞的人。
EOF

# 写文件(覆盖模式)
cat > kubernetes.conf <<EOF
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
EOF

# 写文件(增量模式)
cat >> config.yaml <<EOF
# 新增的配置项
new_key: new_value
EOF

# 多行脚本内嵌内容
mysql -u user -p <<EOF
USE mydb;
SELECT * FROM users;
EOF

# 保留变量(默认行为)
name="宝"
cat <<EOF
你好,$name
EOF

# 不展开变量 / 禁止替换(注意引号)
cat <<'EOF'
你好,$name!
EOF
场景用法说明
写入多行文件cat <<EOF > file最常见
传多行内容给命令cmd <<EOFSQL、邮件、curl
不想变量展开<<'EOF'加引号保留原样
想缩进清爽<<-EOF支持 tab 缩进

sed

返回大纲

sh
# -i: s/模式/替换/g
sed -i 's/^SELINUX=.*/SELINUX=enable/' config.ini

sed -i '/ swap /s/^\(.*\)$/#\1/g' config.ini

awk

返回大纲

TODO

grep

返回大纲

TODO

fd

返回大纲

https://github.com/sharkdp/fd

find 更牛逼的文件查找命令

记住,fd 找文件名,rg 找文件内容

sh
# 在当前目录下查找所有文件/目录名中包含 main 的文件
fd main

# 在 internal/settings 下找名字里含 config 的文件
fd config ./internal/settings

# 在 app/ 目录下找名字里含 login 的 .go 文件
fd -e go login ./app

# 忽略大小写搜索
fd -i login ./app

# 仅查找文件
fd service --type f

# 仅查找目录
fd service --type d

ripgrep

返回大纲

https://github.com/BurntSushi/ripgrep

查找文件中的指定内容,平替 grep

bash
# 在 config/settings.yml 文件里搜索包含关键词 port 的行
rg port config/settings.yml

# 在 internal/ 目录下递归搜索所有包含 login 的行
rg login internal/

# 匹配整个词
rg -w login

# 禁用正则
rg -F 'a+b'

# 支持正则表达式
echo -e "line1\nlineN\nline3" | rg "^line[0-9]$"

fzf

返回大纲

搜索过滤器,不自带搜索文件内容功能

bash
# 查历史命令
history | fzf

# 结合 fd
fd | fzf

# 结合 rg
rg --files | fzf

# 结合 git
git ls-files | fzf

# 切换 Git 分支
git checkout $(git branch --all | fzf)

# 搜索文件
find . -type f | fzf

# 搜索 Git 提交记录
git log --oneline --pretty=format:"%d %h %s %ad %an" --date=short --graph | fzf

venv

返回大纲

TODO

uv

返回大纲

https://docs.astral.sh/uv

下一代 Python 包管理器

bash
# 初始化 Python 项目
uv init myproject

# 激活虚拟环境
uv venv
source .venv/bin/activate

# 下载依赖
uv sync

# 运行程序
uv run main.py

# 清理缓存
uv cache clean

conda

返回大纲

bash
# 禁止自动激活 base 环境
conda config --set auto_activate_base false

conda env list

conda create -n project_name python=3.10

source /opt/anaconda3/bin/activate # 避免报错
conda activate project_name

conda install tensorflow

conda deactivate

wget

返回大纲

TODO

curl

返回大纲

TODO

grpcurl

返回大纲

TODO

wrk

返回大纲

bash
#  启动 2 个线程共同处理 100 个并发连接,压测 5 秒
wrk -t2 -c100 -d5s https://baidu.com

# 显示详细的延迟信息
wrk -t2 -c100 -d5s --latency https://baidu.com

ab

返回大纲

TODO

top

返回大纲

  • P 按 CPU 使用率降序排序
  • M 按内存使用率排序
  • T 按进程运行时间排序
  • k 终止一个进程

htop

返回大纲

TODO

btop

返回大纲

TODO

df

返回大纲

  • disk free
  • 主要用于查看整个文件系统的磁盘使用情况,让你了解磁盘的整体容量和剩余空间。
  • df -h

dust

返回大纲

  • 侧重于以直观的可视化方式展示指定目录下各个子目录和文件的磁盘使用情况,方便快速定位大文件和大目录。
  • dust /home/user/Documents

du

返回大纲

du(disk usage)用来查看文件或目录所占用的磁盘空间大小,是排查“空间去哪了”的工具

sh
# `~/.cache/` 目录下所有文件夹大小汇总,单位易读
du -sh ~/.cache/* | sort -h
du -sh ~/dev/* | sort -h # 很实用!

# 当前整个目录占用多大空间
du -sh .

lsof

返回大纲

bash
# 查看占用端口的进程
lsof -i:1087

nc

返回大纲

TODO

homebrew

返回大纲

sh
# 更新 Homebrew
brew update

# 升级所有已安装的软件包
brew upgrade
# 升级特定软件包
brew upgrade jq

# 列出所有安装的软件包
brew list --version

# 查看软件包信息
brew info jq

npm

返回大纲

TODO

asdf

返回大纲

https://asdf-vm.com

sh
# 安装语言插件
asdf plugin add golang https://github.com/asdf-community/asdf-golang.git

# 安装特定版本
asdf install golang 1.22.6

# 应用于工作目录的版本
asdf set golang 1.22.6

# 应用于所有目录的默认版本
asdf set -u golang 1.22.6

apt

返回大纲

新一代推荐命令,替代 apt-get,操作更简洁

yum

返回大纲

TODO

ssh

返回大纲

bash
ssh luca@192.168.10.70

反向代理 + 远程翻墙

bash
# 本地机开启反向隧道
ssh -N -R 1087:127.0.0.1:1087 root@192.168.10.70

# 云主机配置代理
export http_proxy=http://127.0.0.1:1087 https_proxy=http://127.0.0.1:1087 all_proxy=socks5://127.0.0.1:1087

# 云主机取消代理
unset http_proxy https_proxy all_proxy no_proxy

ssh-keygen

返回大纲

bash
ssh-keygen -t rsa -b 4096 -C "luca@gmail.com"

# 清除旧服务器的指纹记录(~/.ssh/known_hosts),避免连不上
ssh-keygen -R 192.168.10.70

ssh-copy-id

返回大纲

bash
ssh-copy-id luca@192.168.10.70

scp

返回大纲

bash
# 上传文件
scp /local/source/file.txt luca@192.168.10.70:~/destination/

# 上传文件夹
scp -r /local/source luca@192.168.10.70:~/destination/

# 下载文件
scp luca@192.168.10.70:~/source/file.txt  /local/destination/

ffmpeg

返回大纲

bash
# 文件基本信息
ffmpeg -i input.mp4

# 播放视频
ffplay -i video.mp4

# 静音播放
ffplay -an input.mp4

# 仅播放音频
ffplay -vn input.mp4

gdb

返回大纲

TODO

delve

返回大纲

TODO

bat

返回大纲

https://github.com/sharkdp/bat

平替 cat 命令

eza

返回大纲

平替 ls 命令

zoxide

返回大纲

平替 cd 命令

bash
brew install zoxide

# 使用 z 命令代替 cd
z projects

终端快捷键

返回大纲

  • 移动到行首:C-a
  • 移动到行尾:C-e
  • 删除光标前的一个单词:C-w
  • 删除光标前的文本:C-u
  • 删除光标后的文本:C-k

nvim

返回大纲

通用

文本操作

  • 撤销:u
  • 回退:C-R
  • d 删除
  • y 复制
  • d 删除
  • x 剪切
  • dw 删除字符

文件目录管理

https://github.com/nvim-tree/nvim-tree.lua

  • 打开、关闭目录 <leader>e
  • 焦点切换 Ctrl + w
  • 新建文件/目录 a
  • 重命名文件/目录 r
  • 剪切移动文件/目录 x
  • 删除文件/目录 d
  • 拷贝文件/目录 y
  • 粘贴文件/目录 p

插件管理

https://github.com/folke/lazy.nvim

  • :Lazy
  • :Lazy install
  • :Lazy update
  • :Lazy sync(相当于 install 和 update)

LSP

TODO

Telescope

https://github.com/nvim-telescope/telescope.nvim

  • <leader>f + f:Telescope find_files 查找文件
  • <leader>f + g:Telescope live_grep 查找内容

文件内搜索

  • /<pattern> 向下搜索模式
  • ?<pattern> 向上搜索模式
  • n 下一个匹配项
  • N 上一个匹配项

Git

https://github.com/jesseduffield/lazygit

快速了解 lazygit 的功能

移动

单词移动:

  • 替换单个字符:r
  • w
  • b
  • e
  • ge

行内移动:

  • 0 行首
  • ^ 行首非空字符
  • $ 行尾

行间移动:

  • 4j 向下移动 4 行
  • 12k 向上移动 12 行
  • gg 跳转到顶部
  • G 跳转到底部
  • :5050G 跳转到第 50 行

可视模式移动:

  • v 可视模式(字符选择)
  • V 可视行模式(行选择),使用场景:拷贝/剪切/粘贴多行
  • Ctrl+v 可视块模式(块选择),使用场景:添加/删除多行注释
  • 块前缀插入:Ctrl+v → 多行 → Shift+i → 输入 → Esc
    • 场景 1:批量添加注释
  • 块前缀替换:Ctrl+v → 多行 → c → 输入 → Esc
    • 场景 1:git rebase -i 合并 commit
    • 场景 2:批量删除注释

其它移动:

  • % 在括号匹配之间跳转
  • } 移动到下一个段落的开头
  • { 移动到上一个段落的开头

分屏

  • sh 代表水平分屏(Split Horizontally)
  • sv 代表垂直分屏(Split Vertically)
  • sc 关闭窗口 (Close)
  • so 关闭其他 (Others)
  • Alt + h/j/k/l 窗口之间跳转
  • <C-w>方向键 光标切换

其它

systemd

返回大纲

systemd 是现代 Linux 系统的启动大管家,用好 systemctl 和 unit 文件,你能精准控制服务、定时、启动流程、日志,全系统为你打工

.service 文件模版

service
[Unit]
Description=My App Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/myapp --config /etc/myapp.conf
Restart=on-failure
User=www-data
WorkingDirectory=/usr/local/myapp

[Install]
WantedBy=multi-user.target

常用命令

命令作用
systemctl start foo.service启动服务(临时)
systemctl stop foo.service停止服务
systemctl restart foo.service重启服务
systemctl reload foo.service重载配置
systemctl enable foo.service开机自启
systemctl disable foo.service禁止开机自启
systemctl status foo.service查看状态
systemctl is-enabled foo.service是否开机自启
systemctl list-units --type=service列出当前服务
journalctl -u foo.service看服务日志
systemctl daemon-reload配置文件改了要 reload 一下

systemd 服务启动流程图