本文整合了 Shell 命令行的常用技巧,包括文件处理、文本操作、服务管理等实用内容。

Curl 请求

发送 POST 请求:

1
curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:3000/data

日期计算

从给定日期计算 n 天前的日期:

1
2
3
4
5
6
$ date -d "2016-12-31 2 days ago" +%Y-%m-%d
2016-12-29

# 更清晰的语法
$ date -d "2016-12-31 -2 days" +%Y-%m-%d
2016-12-29

find + xargs 组合

遍历文件

1
2
3
4
5
6
7
8
9
10
11
# 对每个文件执行一次 process
find . -name \*.txt -exec process {} \;

# 将所有文件作为参数一次性执行
find . -name \*.txt -exec process {} +

# 使用 xargs
find . -name \*.txt -print0 | xargs -0 process

# 在每个文件名后添加参数
find . -name \*.txt -print0 | xargs -0 -I{} process {} argument

处理大量文件

当文件数量过多导致 “Argument list too long” 错误时:

1
2
3
4
5
6
# 问题
cat *
# -bash: /bin/cat: Argument list too long

# 解决:使用 xargs 分批处理
ls | xargs -n 32 -P 8 cat >> ../saved_output

参数说明:

  • -n 32:每次传递 32 个参数
  • -P 8:并行 8 个进程

文件夹 MD5 校验

1
find /home -type f -print0 | xargs -0 md5sum | sort > md5.txt

文件格式转换

dos2unix 转换

1
2
3
find . -type f | xargs dos2unix
# 或使用 sed
find . -type f | xargs sed -i 's/\r//'

GBK 转 UTF-8

1
iconv -f gbk -t utf-8 bin_struct_define.h > new_bin_struct_define.h

split 文件切割

避免断行问题

使用 -b 按字节切割时可能把一行切断,使用 -C 可以保证在完整行处切割:

1
2
3
4
5
# 可能断行(按字节严格切割)
split -b 100m file.txt file_part_

# 不断行(保持行完整)
split -C 100m file.txt file_part_

-b 和 -C 对比

参数 说明 适用场景
-b 按字节严格切割,可能在行中间切断 二进制文件
-C 按字节切割但保持行完整 文本文件

sed 分隔符技巧

sed 替换命令可以使用任意字符作为分隔符,处理路径时特别有用:

1
2
3
4
5
6
7
8
# 默认使用 /
sed 's/abc/xyz/g'

# 使用 # 处理路径(推荐)
sed 's#/path/to/abc#/path/to/xyz#g'

# 使用 | 作为分隔符
sed 's|/path/to/abc|/path/to/xyz|g'

常用分隔符:

分隔符 使用场景 示例
/ 默认,不包含路径 s/abc/xyz/g
# 处理路径(推荐) s#/path/abc#/path/xyz#g
| 避免管道冲突 s|old|new|g

注意:分隔符不能在模式或替换文本中出现。


命令执行顺序

Shell 中三种命令连接符的执行逻辑:

连接符 执行条件 示例
&& 前面成功才执行后面 cmd1 && cmd2
|| 前面失败才执行后面 cmd1 || cmd2
; 无条件执行后面 cmd1 ; cmd2

实例分析

1
python -m A.py && python /tmp/A.py ; python -m B.py && python /tmp/B.py

执行流程:

  1. 执行 python -m A.py
    • 成功 → 执行 /tmp/A.py
    • 失败 → 跳过 /tmp/A.py
  2. 无论上一步结果,执行 python -m B.py(因为 ;
    • 成功 → 执行 /tmp/B.py
    • 失败 → 跳过 /tmp/B.py

常用模式

1
2
3
4
5
6
7
8
9
10
11
# 确保全部成功
cmd1 && cmd2 && cmd3

# 失败时执行备选
wget https://example.com/file || curl -O https://example.com/file

# 无条件顺序执行
cmd1 ; cmd2 ; cmd3

# 成功失败都记录
cmd && echo "✓ succeeded" || echo "✗ failed"

退出码

1
2
3
4
5
6
7
8
# 查看上一个命令的退出码
echo $?

# 脚本中遇到错误立即退出
set -e

# 严格模式(推荐)
set -euo pipefail

Systemctl 服务管理

查看服务

1
2
3
4
5
6
7
8
# 运行中的服务
systemctl list-units --type=service --state=running

# 所有服务
systemctl list-units --type=service --all

# 失败的服务
systemctl --failed

管理服务

操作 命令
启动服务 systemctl start <service>
停止服务 systemctl stop <service>
重启服务 systemctl restart <service>
重载配置 systemctl reload <service>
查看状态 systemctl status <service>
启用开机自启 systemctl enable <service>
禁用开机自启 systemctl disable <service>

数据同步

rsync 用法

1
rsync -avzP --delete root@{remoteHost}:{remoteDir} {localDir}

参数说明:

参数 说明
-a 归档模式(递归、保持权限等)
-v 显示详细信息
-z 传输时压缩
-P 显示进度
--delete 删除目标端多余文件

代码统计

统计代码行数

一句命令统计项目代码行数:

1
2
3
4
5
6
7
8
# 统计当前目录下所有 .py 文件的行数
find . -name "*.py" | xargs wc -l

# 排除空行和注释行(以 Python 为例)
find . -name "*.py" | xargs grep -v "^$" | grep -v "^#" | wc -l

# 使用 cloc 工具(推荐)
cloc .

参考: 一句shell命令搞定代码行数统计


其他技巧

查看端口

1
nmap hostname

实时过滤日志

1
tail -f file | grep --line-buffered my_pattern

重映射 Caps Lock 为 Ctrl

1
2
3
sudo vi /etc/default/keyboard
XKBOPTIONS="ctrl:nocaps"
setxkbmap -layout us -option ctrl:nocaps

参考链接