本文整合了 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
| find . -name \*.txt -exec process {} \;
find . -name \*.txt -exec process {} +
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 *
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
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
|
执行流程:
- 执行
python -m A.py
- 成功 → 执行
/tmp/A.py
- 失败 → 跳过
/tmp/A.py
- 无论上一步结果,执行
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
| find . -name "*.py" | xargs wc -l
find . -name "*.py" | xargs grep -v "^$" | grep -v "^#" | wc -l
cloc .
|
参考: 一句shell命令搞定代码行数统计
其他技巧
查看端口
实时过滤日志
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
|
参考链接