偶然在 GitHub 刷到了 这个项目,里面有各种各样的 bash 使用小技巧,但是它真的很长😰,以至于我没有信心一口气读完它。那干脆重新翻译整理一遍好了,顺便还能当个字典用,有需要就回来查一查


  • 注意:本文只会收录我在自己机器 zsh 环境下实测有效、且认为比较有用的条目,同时也会补充一些自己的内容

终端技巧

  • 快捷键(Ctrl+?)

Ctrl + R:搜索历史命令

Ctrl + A:光标移动到行首

Ctrl + D:发送 EOF

Ctrl + K:删除从光标到行末的所有字符

Ctrl + W:剪切光标前的单词,使用 Ctrl + Y 粘贴

Ctrl + U:剪切光标前的行,使用 Ctrl + Y 粘贴

Ctrl + _:撤销输入

Ctrl + L:清屏(不重置滚动条)

  • 通过 history 中的号码指定命令
1
!4160
  • 执行上一条命令
1
2
3
!!
# 使用 sudo 执行上一条命令
sudo !!
  • 执行特定字符串开头的历史命令
1
2
3
cat filename
# 再次执行 cat filename
!cat
  • 路径名模式扩展(glob)
1
2
3
4
5
6
7
8
9
10
11
# '*'  匹配任意字符零次或多次
/etc/pa*wd # /etc/passwd

# '?' 匹配任意字符一次
/b?n/?at # /bin/cat

# '[]' 匹配区间中的字符
ls -ld /proc/[0-9]* # 打印所有以数字开头的文件夹

# '{}' 匹配一个组
ls *.{sh,py} # 列出所有 .sh 和 .py 文件
  • 常用的环境变量

$0:可执行文件名

$1$2$3:位置参数

$#:参数的数量

$?:上一条命令的退出代码

$$:当前 shell 的 pid

  • 切片操作
1
2
3
VAR="123456"
echo ${VAR:1:3} # 234
echo ${VAR:2} # 3456
  • 字符串替换
1
2
3
VAR="banana"
echo ${VAR/a/#} # b#nana
echo ${VAR//a/#} # b#n#n#
  • cat 输出多行内容
1
2
3
4
cat <<EOF > hello.py
name = input('> ')
print(f'Hello, {name}')
EOF
1
2
3
4
5
cat <<EOF | python3
import os
name = os.environ['USER']
print(f'Hello, {name}')
EOF
  • 快速复制(zsh)
1
2
3
sudo apt install xclip
alias copy='tee $(tty) | xclip -selection clipboard -r'
echo 'something to copy...' | copy

字符串操作(grep、sed、awk)

grep

grepgrep -G:基本正则表达式(BRE)
fgrepgrep -F:全字匹配模式
egrepgrep -E:扩展正则表达式(ERE)

  • 统计空行的数量
1
grep -c "^$"
  • 匹配完整单词
1
2
3
4
grep -w 'target'

# 或使用正则表达式
grep '\btarget\b'
  • 显示匹配行的前后几行
1
2
3
4
5
6
7
8
# 同时显示匹配行的后三行
grep -A 3 'bbo'

# 同时显示匹偶行的前三行
grep -B 3 'bbo'

# 同时显示匹配行的前后三行
grep -C 3 'bbo'
  • 只打印第一次匹配的结果
1
ps -ef | grep -m 1 chrome
  • 统计匹配的行数
1
ps -ef | grep -c chrome
  • 统计模板出现的次数
1
ps -ef | grep -o chrome | wc -l
  • 递归地在文件中搜索
1
2
3
4
5
# 不跟随符号链接
grep -r pattern /path/to/directory/

# 跟随符号链接
grep -R pattern /path/to/directory/

xargs 的使用

  • 查找所有 pdf 文件并复制到指定文件夹
1
find -name '*.pdf' | xargs -I {} cp {} ../output/
  • 将每 3 个参数划分为一组(-n 3),并打开命令显示(-t
1
seq 10 | xargs -n 3 -t echo

  未完待续……