Featured image of post Linux 系统工具命令速查:cat/grep/sed/find/tar/tmux/top 等 20+ 工具精要

Linux 系统工具命令速查:cat/grep/sed/find/tar/tmux/top 等 20+ 工具精要

2015 时代 Linux 命令行最常用 20+ 系统工具——文件查看(cat/ls)、文本处理(grep/sed/find)、进程管理(ps/kill/top/tmux)、压缩归档(tar)、系统信息(lscpu/journalctl/glances)、网络与杂项

一、为什么是 2015 年这一份

2015 年这个时间点前后,Linux 命令行工具进入"成熟稳定期":

  • 核心三剑客(cat/grep/sed/awk/find)自 1980 年代起就没大改过
  • GNU coreutils 系列(ls/cat/md5sum/envsubst 等)2015 已是 8.x
  • systemd 在 RHEL 7(2014)/ CentOS 7(2014)/ Ubuntu 15.04(2015)陆续上位
  • top 3.x 时代 / tmux 1.x 稳定(tmux 2.0 是 2015-04 发布的)
  • glances 2.x 时代(glances 2.0 是 2014-12 发布的)

这一篇覆盖日常 Linux 工作中出现频次最高的 20+ 工具——文件查看、文本处理、进程管理、压缩归档、系统信息、杂项命令。每条只给"够用"的参数速查,不展开手册(详见各命令的 man 页)。

阅读建议:本文按"主题归类"组织,每个小节独立可读。遇到具体场景直接 Ctrl+F 搜命令名。

二、文件查看与操作

2.1 cat:查看文件内容

cat 是"concatenate"的简写,2015 已是 8.x 时代。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 查文件内容
cat filename

# 把 EOF 加上引号,变量就不会被解析
cat <<"EOF" > docker-compose.yaml
version: "3"
services:
  base:
    image: ...
EOF

重要细节cat <<"EOF" vs cat <<EOF 区别在引号。带引号时 shell 不解析 $VAR、反引号等,写 Dockerfile / K8s manifest 这种带 $VAR 的模板文件时必须用引号

2.2 ls:列出文件信息

1
2
3
4
5
# 查文件大小
ls -l 文件名 | awk '{print $5}'

# 字节数
stat -c "%s" 文件名

2.3 md5sum:校验文件完整性

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 生成校验码
md5sum docker-compose > docker-compose-md5sums.txt

# 多个文件
md5sum 文件1 文件2 > fs.md5
md5sum 文件1 文件2 >> fs.md5

# 校验(输出 OK / FAILED)
md5sum -c docker-compose-md5sums.txt

# 只看退出码(CI/CD 场景)
md5sum --status -c docker-compose-md5sums.txt
echo $?    # 0=全 OK,1=有 FAILED

2.4 hdparm:测试磁盘读写速度

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 测试读取效率
hdparm -t /dev/sda

# 测试硬盘缓存的读取速度
hdparm -T /dev/sda

# 直接测试(绕过缓存)
hdparm -tT --direct /dev/sda

# 查看 DMA 情况
hdparm -cdt /dev/sda

2.5 rm:删除文件/目录

大量文件不能用 rm *,会触发 -bash: /bin/rm: 参数列表过长

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 查看大文件/目录
du -sh * | sort -hr | head

# 方法一:find + rm
find . -type f -mtime +0 -exec rm -f {} +

# 方法二:xargs 分组
find . -name "*" | xargs rm -rf '*'

# 方法三:ls + xargs 限定每组 9 个
ls | xargs -n 9 rm -rf

# 清理两天前的数据
find ./ -mtime +1 | xargs rm -rf

三、文本处理三剑客

3.1 grep:搜索匹配行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 显示上下行数
grep -C 50 pattern file

# 显示前 / 后
grep -B 5 pattern file
grep -A 5 pattern file

# 不区分大小写
grep -i pattern file

# 实战:查 docker 日志里最后百万行有 error 关键字的不区分大小写前后 10 行
docker logs -f --tail=1000000 appbackend | grep -C 10 -i error

3.2 sed:流编辑器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 内容追加
# 首行追加
sed -i "1i\内容" 文件名
sed -i "1i\SET FOREIGN_KEY_CHECKS = 0;" /tools/safety.sql

# 尾行追加
echo "内容" >> 文件名

# 打印第一行 / 最后一行
sed -n 1p /tools/safety.sql
sed -n '$p' /tools/safety.sql
tail -n 1 /tools/safety.sql
awk 'END{print}' /tools/safety.sql

# 删除
sed -i '1d' /tools/safety.sql   # 删第一行
sed -i '$d' /tools/safety.sql   # 删最后一行

# 全局替换
sed -i 's/原字符串/新字符串/g' 文件名

3.3 find:查找文件

1
2
3
4
5
6
7
8
9
# 当前目录下找名为 file.txt 的文件
find . -name file.txt

# 找大文件 / 旧文件
find . -type f -size +100M
find . -type f -mtime +30

# 找并执行命令
find . -name "*.log" -exec rm -f {} \;

四、进程管理

4.1 ps:查看进程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 经典组合
ps -aux
#  a: 显示所有程序
#  u: 以用户为主的格式
#  x: 显示所有程序,不以终端机区分

# 查指定进程
ps -aux | grep test.sh | grep -v grep

# 内存占用高的前 20
ps aux | head -1; ps aux | grep -v PID | sort -rn -k +4 | head -20

grep -v grep:把 grep 命令本身从结果里排除掉,否则会看到自己。

4.2 kill:杀进程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 优雅退出
kill <pid>

# 强制退出
kill -9 <pid>

# 杀某用户的所有进程
pkill -u 用户名

# 杀进程并踢出登录
pkill -kill -t tty

4.3 top:实时进程监控

top 是 1991 年起的"上古"工具,至今仍是 Linux 性能观测的入门首选。

1
top -c -bw 512    # 显示完整命令行,输出宽度 512

输出解读

含义
第 1 行当前时间、运行时间、当前用户、CPU 平均负载(1/5/15 分钟)
第 2 行总/运行/休眠/停止/僵尸进程数
第 3 行us(用户)/ sy(内核)/ ni(调整优先级)/ id(空闲)/ wa(等待 IO)/ hi(硬件中断)/ si(软件中断)/ st(虚拟化偷走)
第 4 行物理内存总量、空闲、已用、内核缓存
第 5 行虚拟内存总量、空闲、已用、下一波分配量

进程字段

字段含义
PID进程 ID
USER进程用户名
PR动态优先级
NI静态优先级(可被 nice 调整)
VIRT虚拟内存
RES物理内存
SHR共享内存
S状态(D 不可中断 / I idle / R 运行 / S 睡眠 / T 停止 / Z 僵尸)
%CPU / %MEMCPU / 内存占用
TIME+累计 CPU 时间
COMMAND命令

Java 进程的 VIRT 异常大:Java 8+ 用 Metaspace 取代 PermGen,元空间放在 OS 本地内存。每个线程都分配一个 arena(64MB),线程一多 VIRT 就巨大。这不是真用了那么多内存——要用 pmap 查真实占用。

1
2
3
pmap -x <pid> | sort -n -k3
# 输出内存块详细信息
cat /proc/<pid>/smaps

常用快捷键

快捷键功能
shift+m按内存排序
shift+P按 CPU 排序
shift+t按时间排序
shift+n按 PID 排序
m内存显示模式
E内存总览单位
e进程内存单位
c显示完整命令行
i不显示闲置
l启动时间和平均负载

4.4 tmux:终端复用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 安装
yum -y install tmux     # CentOS
apt install -y tmux     # Debian/Ubuntu

# 新建会话
tmux new -s session_name

# 退出(不关会话)
# ctrl + b 再输入 d

# 进入已有会话
tmux attach -t session_name

# 查看所有会话
tmux ls
# ctrl + b 再输入 s    交互式切换

# 关闭指定会话
tmux kill-session -t session_name

# 关闭所有会话
tmux ls | grep : | cut -d. -f1 | awk '{print substr($1, 0, length($1)-1)}' | xargs kill

4.5 nohup:不挂断运行

1
2
# 不挂断运行 test.sh,输出重定向到 output.log
nohup ~/user/test.sh > output.log 2>&1 &
  • 0 —— 键盘输入
  • 1 —— 屏幕输出(标准输出)
  • 2 —— 错误输出
  • 2>&1 —— 把错误输出重定向到标准输出
  • 最后的 & —— 后台运行

jobs 命令只对当前终端有效,关闭终端后 jobs 就看不到后台进程了,此时用 ps

1
2
3
4
5
# 显示所有任务的进程号
jobs -l

# 显示任务状态变化
jobs -n

五、压缩归档

5.1 tar:归档与压缩

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 五个独立命令
#  -c: 建立压缩档案
#  -x: 解压
#  -t: 查看内容
#  -r: 向压缩归档文件末尾追加文件
#  -u: 更新原压缩包中的文件

# 可选参数
#  -z: gzip
#  -j: bz2
#  -Z: compress
#  -v: 显示所有过程
#  -O: 将文件解开到标准输出
#  -f: 使用档案名字(必须是最后一个参数)

# 压缩
tar -zcvf xxx.tar.gz xxx

# 解压
tar -zxvf xxx.tar.gz

# 解压到指定文件夹(文件夹必须已存在)
tar -zxvf /file/xxx.tar.gz -C /home/docker

六、系统信息

6.1 CPU 信息

1
2
3
4
5
6
7
8
# 最详细
cat /proc/cpuinfo

# 简单
lscpu

# 最简单:只显示核心数
nproc

统计 CPU 数量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 总核数 = 物理 CPU 个数 × 每颗物理 CPU 的核数
# 总逻辑 CPU 数 = 物理 CPU 个数 × 每颗物理 CPU 的核数 × 超线程数

# 物理 CPU 个数
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l

# 每个物理 CPU 的核数
cat /proc/cpuinfo | grep "cpu cores" | uniq

# 逻辑 CPU 个数
cat /proc/cpuinfo | grep "processor" | wc -l

# 线程数 = 逻辑 CPU 数
grep 'processor' /proc/cpuinfo | sort -u | wc -l

# 超线程:cpu cores 和 siblings 不一致则开启
cat /proc/cpuinfo | grep -e "cpu cores" -e "siblings" | sort | uniq

6.2 内存信息

1
2
3
4
5
6
7
# 查所有内存设备的详细信息
sudo dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range
# 或
dmidecode -t 17

# 完整版
dmidecode | grep -A16 'Memory Device'

6.3 主板/PCI 设备

1
2
3
4
5
yum install -y pciutils    # centos 安装(ubuntu 22.04+ 自带)
lspci -v

# 网卡驱动详细信息
ethtool -i eno1

6.4 journalctl:systemd 日志查询

journalctl 是 systemd 的日志工具,2015 年起在主流发行版成为默认日志系统。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 看本机启动以来的所有日志
journalctl

# 看指定服务
journalctl -u nginx

# 看内核日志
journalctl -k

# 看最近 10 分钟
journalctl --since "10 min ago"

# 跟踪(类似 tail -f)
journalctl -f

# 看指定时间段
journalctl --since "2024-01-01" --until "2024-01-02"

七、glances:htop 的"加强版"

glances(2014-12 发布 2.0)提供一屏式综合监控,常被推荐为 htop 的替代品。

1
2
3
4
5
6
7
8
9
# 安装
yum -y install glances        # CentOS
apt install -y glances        # Debian/Ubuntu

# 配套:硬件温度监控
yum -y install lm_sensors

# 启动
glances

关于 htop:htop 在 2015 仍是 top 的"事实标准"加强版。glances 的差异在"一屏看 CPU / 内存 / 磁盘 / 网络 / 进程全维度"。本文不展开,详见独立文章。

八、环境变量与模板:envsubst

envsubst 是 GNU gettext 套件里的小工具,专门做"模板 + 环境变量 → 配置":

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 1. 模板文件 t.yaml
cat << "EOF" > t.yaml
systeminfo:
  OS: $OS
  user: $USER
  home: $HOME
  args:
    [
      "$args"
    ]
EOF

# 2. 脚本 t.sh
cat << "EOF" > t.sh
#!/usr/bin/env bash
export OS=$(uname -s)
export args="/wait.sh 10.8.33.127:8848 -t 0"
ports=(100 200 300)
nodePort=30000
for p in ${ports[*]}; do
  nodePort=$[$nodePort+1]
  sed -i "8a \    - name: port$p\n      port: $p\n      targetPort: $p\n      nodePort: $nodePort" t.yaml
done
envsubst < t.yaml > t1.yaml
EOF

# 3. 跑脚本
bash t.sh

# 4. 清理
rm -rf t.yaml t1.yaml t.sh

典型场景:用模板生成 K8s 部署文件——一份 YAML 模板 + 多个环境变量 → 多份目标 manifest。

九、pciutils:网卡/PCI 设备排查

lspci 是排查网卡驱动问题最常用的工具。当一个新机器装完系统发现网卡识别不到,先看 lspci 找到芯片型号,再去厂商站下载驱动。

1
2
3
4
5
# 显示网卡
yum install -y pciutils   # centos 安装(ubuntu 22.4+ 自带)
lspci -v
# 或
ethtool -i eno1

常见坑:Realtek r8168 网卡在 CentOS 7 默认驱动下表现不佳,需要从 Realtek 官网下载驱动源码手动编译。常见编译错误 ether_addr_copy 重定义ndo_change_mtu 等都需要手动改源码适配内核版本。

十、nohup + 进程组:2>&1 的真意

2>&1 的写法非常常见但很多人不理解。这里给一个完整图:

文件描述符含义默认指向
0stdin(键盘输入)键盘
1stdout(标准输出)屏幕
2stderr(错误输出)屏幕
1
2
3
4
5
6
7
8
# 把 stderr 重定向到 stdout
command > out.log 2>&1

# 把 stdout 重定向到 file,stderr 仍走屏幕
command > out.log

# 把 stdout 和 stderr 都丢进黑洞
command > /dev/null 2>&1

nohup + & + > log 2>&1 是后台跑长任务的标准三件套。

十一、systemctl 资源限制

systemctl edit 是给已有 service 加 overlay 配置(不修改原 unit 文件):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 编辑 sshd 的 overlay
systemctl edit sshd

[Service]
CPUQuota=20%
MemoryLimit=256M
Nice=-10
IOWeight=100

sudo systemctl daemon-reload
sudo systemctl restart sshd
字段含义
CPUQuota=20%限制最多用 20% 单核 CPU
MemoryLimit=256M限制最大 256M 内存
Nice=-10优先级(-20~19,越小越高)
IOWeight=100IO 权重(1~10000)

十二、前置知识 / 下一步

  • 想看 journalctl 完整用法 → man journalctl
  • 想看 top 完整字段 → man top
  • 想看 sed 完整正则语法 → man sed
  • 想看 fio 性能压测 → 翻本系列《Linux 磁盘与 LVM 深度实践》
  • 想看 systemctl 完整服务管理 → 翻本系列《Linux 远程登录与安全实践》中的 service 文件部分

十三、参考资源


2024 视角:10 年后这 20+ 工具的"现代化"姿势

2015 年这份速查在 2024 仍有 90% 适用——这正是 GNU coreutils 三剑客的"长青"价值。但在 2024 年的服务器上,有几处需要更新:

一、net-tools 真的可以删了

  • 2015 年时 netstat 还在主流发行版,2024 年 RHEL 9 / Ubuntu 24.04 已彻底移除 net-tools

  • ss(iproute2)已经完全替代:

    1
    2
    3
    
    ss -tulnp             # 替代 netstat -tulnp
    ss -s                 # 替代 netstat -s(统计)
    ss -tin               # TCP 连接详细信息(含拥塞窗口、重传)
    
  • ifconfig 替代品:

    1
    2
    
    ip -br addr show      # 简洁模式
    ip -c addr show       # 彩色输出
    
  • route 替代品:

    1
    2
    
    ip route show
    ip -6 route show      # IPv6 路由
    

二、htop 仍是 top 首选替代

  • htop 3.x(2022+)已经支持鼠标操作、横向滚动、进程树折叠,2024 是事实标准。
  • btop(2021 推出)更激进:CPU/内存/磁盘/网络一屏 + 图形化 sparkline,颜值党首选
  • glances 仍是 Web/API 化的最佳选择:可以 glances -w 启 Web 服务(默认 61208 端口),浏览器看监控。

三、tmux 3.x 的新特性

  • tmux 3.0(2021-04 重大版本)之后:

    • status-line 支持字符串插值#{...} 语法)
    • popup 弹窗display-popup -E "cmd"
    • mouse 模式改进
  • 2024 推荐配置 ~/.tmux.conf

    1
    2
    3
    
    set -g mouse on
    set -g default-terminal "tmux-256color"
    set -ag terminal-overrides ",xterm-256color:RGB"
    

四、systemd 资源控制的"现代写法"

2015 那篇给的 CPUQuota=20% 仍是有效写法,但 2024 更精细的有:

  • CPU 亲和性

    1
    2
    
    [Service]
    CPUAffinity=0-3
    
  • 内存 + 交换空间硬限制

    1
    2
    
    MemoryMax=512M
    MemorySwapMax=0           # 禁用 swap
    
  • IO 控制器(systemd 240+):

    1
    2
    
    IOReadBandwidthMax=/dev/sda 100M
    IOWriteBandwidthMax=/dev/sda 50M
    

五、journalctl 仍是事实标准

  • 但 2024 推荐结构化查询

    1
    2
    3
    4
    
    journalctl -u nginx --since "1 hour ago" --output=json | jq .
    journalctl -u nginx -p err -n 50 -f         # 跟踪错误
    journalctl --vacuum-size=200M                # 限制日志大小
    journalctl --list-boots                      # 看启动历史
    

六、fzf 应该是 2024 必装

2015 年没提的"现代神器"——fzf(命令行模糊查找器):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 装
apt install fzf    # 或 brew install fzf

# 用
Ctrl-R              # 模糊搜索历史命令
Ctrl-T              # 模糊搜索文件
Alt-C               # 模糊切换目录

# 管道
ps aux | fzf | awk '{print $2}' | xargs kill

fzf 让"在 1 万条历史命令里找刚才那条"变成 < 1 秒,是 2015 → 2024 提效最大的一颗"小宝石"。

使用 Hugo 构建
主题 StackJimmy 设计