lsof(list open files)用于查看进程打开的文件。
| 参数 | 说明 |
|---|
-a | 列出打开文件存在的进程 |
-c<进程名> | 列出指定进程打开的文件 |
-g | 列出 GID 号进程详情 |
-d<文件号> | 列出占用该文件号的进程 |
+d<目录> | 列出目录下被打开的文件 |
+D<目录> | 递归列出目录下被打开的文件 |
-i<条件> | 列出符合条件的进程 |
-p<进程号> | 列出指定进程打开的文件 |
-u | 列出 UID 号进程详情 |
| 字段 | 说明 |
|---|
| COMMAND | 进程名称 |
| PID | 进程标识符 |
| USER | 进程所有者 |
| FD | 文件描述符(cwd、txt、mem 等) |
| TYPE | 文件类型(DIR、REG、IPv4 等) |
| NAME | 文件路径 |
# 查找某个文件相关的进程
lsof /bin/bash
# 列出某个用户打开的文件
lsof -u username
# 列出某个程序打开的文件
lsof -c mysql
# 列出所有网络连接
lsof -i
# 列出 TCP 连接
lsof -i tcp
# 列出占用某个端口的进程
lsof -i :3306
| 状态码 | 说明 |
|---|
| D | 不可中断(通常 IO) |
| R | 运行中 |
| S | 中断(休眠) |
| T | 停止 |
| Z | 僵死 |
| 参数 | 说明 |
|---|
-e | 显示所有进程 |
-f | 显示程序间的关系 |
-H | 显示树状结构 |
-u<用户> | 指定用户的进程 |
-aux | 显示所有进程(含其他用户) |
# 显示所有进程
ps -A
# 显示指定用户进程
ps -u root
# 显示所有进程(带命令行)
ps -ef
# 查找特定进程
ps -ef | grep ssh
# 查看当前终端进程
ps -aux
top 是 Linux 下的实时任务管理器。
| 命令 | 说明 |
|---|
q | 退出 |
s | 设置刷新间隔 |
P | 按 CPU 使用率排序 |
M | 按内存使用排序 |
u | 指定显示用户进程 |
k | 终止进程 |
i | 只显示运行中的进程 |
h | 显示帮助 |
# 启动 top
top
# 按内存排序
top -o %MEM
# 按 CPU 排序
top -o %CPU
# 显示指定用户进程
top -u username
| 参数 | 说明 |
|---|
-O | 指定输出文件名 |
-c | 断点续传 |
-b | 后台下载 |
--limit-rate | 限速下载 |
--user-agent | 伪装 User-Agent |
-i | 从文件读取 URL 列表 |
# 下载单个文件
wget http://example.com/file.zip
# 下载并指定文件名
wget -O output.zip http://example.com/file.zip
# 断点续传
wget -c http://example.com/large-file.zip
# 后台下载
wget -b http://example.com/file.zip
# 限速下载
wget --limit-rate=300k http://example.com/file.zip
# 从文件读取 URL 列表
wget -i filelist.txt
# 镜像网站
wget --mirror -p --convert-links -P ./LOCAL URL
crontab 用于周期性执行任务。
| 参数 | 说明 |
|---|
-e | 编辑 crontab 文件 |
-l | 显示 crontab 文件 |
-r | 删除 crontab 文件 |
-u<用户> | 指定用户 |
分 时 日 月 星期 命令
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └── 星期 (0-7, 0和7是周日)
│ │ │ └────── 月 (1-12)
│ │ └───────── 日 (1-31)
│ └──────────── 小时 (0-23)
└──────────────── 分钟 (0-59)
# 编辑 crontab
crontab -e
# 列出 crontab
crontab -l
# 删除 crontab
crontab -r
# 每分钟执行
* * * * * /path/to/command
# 每天 9 点执行
0 9 * * * /path/to/command
# 每周一 9 点执行
0 9 * * 1 /path/to/command
# 每小时执行
0 * * * * /path/to/command
# 每天 2 点和 5 点执行
0 2,5 * * * /path/to/command
crontab 示例
# 每天凌晨 3 点备份数据库
0 3 * * * /usr/local/mysql/bin/mysqldump -u root -p123456 db > /backup/db.sql
# 每小时清理日志
0 * * * * /usr/bin/find /var/log -name "*.log" -mtime +7 -exec rm {} \;
xargs 将标准输入转换为命令行参数,常配合管道使用。
| 参数 | 说明 |
|---|
-n N | 每次传递 N 个参数 |
-d DELIM | 指定分隔符 |
-0 | 用 null 字符分隔(处理空格) |
-I {} | 指定替换字符串 |
-p | 显示将要执行的命令并确认 |
-t | 显示将要执行的命令 |
# 查找并删除
find . -name "*.tmp" | xargs rm
# 查找并显示详情
find . -name "*.log" | xargs ls -l
# 每次传递一个参数
find . -name "*.txt" | xargs -n 1 wc -l
# 处理带空格的文件名
find . -name "*.txt" -print0 | xargs -0 rm
# 使用替换字符串
cat filelist.txt | xargs -I {} cp {} /backup/
# 确认后执行
find . -name "*.tmp" | xargs -p rm
# 查找包含关键字的文件
grep -rl "error" . | xargs rm
# 查找并替换
grep -rl "old_text" . | xargs sed -i 's/old_text/new_text/g'
| 参数 | 说明 |
|---|
-n | 按数字排序 |
-r | 降序排序 |
-k N | 按第 N 列排序 |
-t DELIM | 指定分隔符 |
-u | 去重 |
-f | 忽略大小写 |
-h | 按人类可读的数字排序(如 1K、1M) |
# 按字母排序
sort file.txt
# 按数字排序
sort -n file.txt
# 降序排序
sort -rn file.txt
# 按第 2 列排序
sort -k2 file.txt
# 按冒号分隔的第 1 列排序
sort -t: -k1 /etc/passwd
# 去重排序
sort -u file.txt
# 按人类可读数字排序
ls -lh | sort -k5 -h
# 按数字排序并去重
du -sh * | sort -rh | head -10
tr 用于字符的替换、删除和压缩。
# 大写转小写
echo "HELLO" | tr 'A-Z' 'a-z'
# 小写转大写
echo "hello" | tr 'a-z' 'A-Z'
# 删除字符
echo "hello123" | tr -d '0-9'
# 删除重复字符
echo "aaabbbccc" | tr -s 'a-c'
# 删除空格并压缩
echo "a b c" | tr -s ' '
# 替换特殊字符
echo "hello\tworld" | tr '\t' ','
# 使用字符类
echo "HELLO123" | tr '[:upper:]' '[:lower:]'
常用字符类:
| 字符类 | 说明 |
|---|
[:alnum:] | 字母和数字 |
[:alpha:] | 字母 |
[:digit:] | 数字 |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:space:] | 空白字符 |
[:punct:] | 标点符号 |
| 参数 | 说明 |
|---|
-b N | 按字节提取 |
-c N | 按字符提取 |
-d DELIM | 指定分隔符 |
-f N | 按字段提取 |
--complement | 取反 |
# 提取第 1-5 个字符
cut -c1-5 file.txt
# 提取第 1 和第 3 个字符
cut -c1,3 file.txt
# 按冒号提取第 1 和第 7 列
cut -d: -f1,7 /etc/passwd
# 提取第 1-5 列
cut -d, -f1-5 file.csv
# 除了第 2 列都提取
cut -d, -f2 --complement file.csv
# 提取文件所有行指定字节
cut -b1-100 file.txt
uniq 用于去除相邻的重复行。
| 参数 | 说明 |
|---|
-c | 显示每行出现次数 |
-d | 只显示重复行 |
-u | 只显示不重复的行 |
-i | 忽略大小写 |
-f N | 跳过前 N 个字段 |
-s N | 跳过前 N 个字符 |
# 去重(相邻重复)
sort file.txt | uniq
# 显示重复行及其次数
sort file.txt | uniq -c | sort -rn
# 只显示重复行
sort file.txt | uniq -d
# 只显示不重复的行
sort file.txt | uniq -u
# 忽略大小写
sort file.txt | uniq -ic
# 跳过前 2 个字段比较
sort file.txt | uniq -f2
文本处理管道
常用组合:
# 统计日志中 IP 访问次数
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# 查找重复文件
find . -type f -exec md5sum {} \; | sort | uniq -D -w32
# 提取并排序唯一值
cat file.txt | grep pattern | cut -d: -f2 | sort -u