Shell 命令行完全指南
本文整合了 Shell 命令行的常用技巧,包括文件处理、文本操作、服务管理等实用内容。
Curl 请求
发送 POST 请求:
curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:3000/data
日期计算
从给定日期计算 n 天前的日期:
$ 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 组合
遍历文件
# 对每个文件执行一次 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” 错误时:
# 问题
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 校验
find /home -type f -print0 | xargs -0 md5sum | sort > md5.txt
文件格式转换
dos2unix 转换
find . -type f | xargs dos2unix
# 或使用 sed
find . -type f | xargs sed -i 's/\r//'
GBK 转 UTF-8
iconv -f gbk -t utf-8 bin_struct_define.h > new_bin_struct_define.h
split 文件切割
避免断行问题
使用 -b 按字节切割时可能把一行切断,使用 -C 可以保证在完整行处切割:
# 可能断行(按字节严格切割)
split -b 100m file.txt file_part_
# 不断行(保持行完整)
split -C 100m file.txt file_part_
-b 和 -C 对比
| 参数 | 说明 | 适用场景 |
|---|---|---|
-b | 按字节严格切割,可能在行中间切断 | 二进制文件 |
-C | 按字节切割但保持行完整 | 文本文件 |
sed 分隔符技巧
sed 替换命令可以使用任意字符作为分隔符,处理路径时特别有用:
# 默认使用 /
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 |
实例分析
python -m A.py && python /tmp/A.py ; python -m B.py && python /tmp/B.py
执行流程:
- 执行
python -m A.py- 成功 → 执行
/tmp/A.py - 失败 → 跳过
/tmp/A.py
- 成功 → 执行
- 无论上一步结果,执行
python -m B.py(因为;)- 成功 → 执行
/tmp/B.py - 失败 → 跳过
/tmp/B.py
- 成功 → 执行
常用模式
# 确保全部成功
cmd1 && cmd2 && cmd3
# 失败时执行备选
wget https://example.com/file || curl -O https://example.com/file
# 无条件顺序执行
cmd1 ; cmd2 ; cmd3
# 成功失败都记录
cmd && echo "✓ succeeded" || echo "✗ failed"
退出码
# 查看上一个命令的退出码
echo $?
# 脚本中遇到错误立即退出
set -e
# 严格模式(推荐)
set -euo pipefail
Systemctl 服务管理
查看服务
# 运行中的服务
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 用法
rsync -avzP --delete root@{remoteHost}:{remoteDir} {localDir}
参数说明:
| 参数 | 说明 |
|---|---|
-a | 归档模式(递归、保持权限等) |
-v | 显示详细信息 |
-z | 传输时压缩 |
-P | 显示进度 |
--delete | 删除目标端多余文件 |
代码统计
统计代码行数
一句命令统计项目代码行数:
# 统计当前目录下所有 .py 文件的行数
find . -name "*.py" | xargs wc -l
# 排除空行和注释行(以 Python 为例)
find . -name "*.py" | xargs grep -v "^$" | grep -v "^#" | wc -l
# 使用 cloc 工具(推荐)
cloc .
其他技巧
查看端口
nmap hostname
实时过滤日志
tail -f file | grep --line-buffered my_pattern
重映射 Caps Lock 为 Ctrl
sudo vi /etc/default/keyboard
XKBOPTIONS="ctrl:nocaps"
setxkbmap -layout us -option ctrl:nocaps