Linux常用命令详解:文件操作、文本处理与进程网络排查
2026/9/17 8:38:15 网站建设 项目流程

简介:Linux系统管理中,命令行的熟练程度直接影响工作效率,而掌握命令的核心不在于死记硬背,而在于理解其工作原理与适用边界。文件操作是日常使用频次最高的场景,ls、cp、rm、find等命令的参数细节常常决定成败;文本处理则是日志分析与配置修改的利器,grep、awk、sed通过管道组合能完成复杂的统计与替换任务。在服务器故障排查中,ps、top、free、ss等进程与网络命令能帮助快速定位资源消耗和端口问题。本文从命令的设计原理出发,结合工程实践中的常见坑点,系统梳理了文件、文本、进程网络三大类高频命令的参数用法、组合技巧与安全注意事项,帮助读者构建一份可查询、敢执行、随环境迁移的个人命令手册。

1. “最全常用Linux命令集”不是背出来的,是查出来的

《最全常用Linux命令集》这类手册,最常见的下场是收藏后吃灰。号称“最全”的版本按字母排序把几百条命令塞进 PDF,真到排查问题时想不起命令名、拼不对参数;而“常用100条”又太薄,find 的 -exec、awk 的 FS 这类高频细节只有一行示例,根本不够用。

这里换个组织方式:把日常开发和运维真正用得上的命令按“文件、文本处理、进程网络、组合执行”四类拆开,每条给出常用参数、容易踩的坑和最小可复现示例。适合两类人:Linux 新手照着命令能一步步跑通;有几年经验的老手重点看参数边界和手册里不写的细节。命令集的价值不在“全”,而在“查得到、敢执行”。

2. Linux常用文件命令:ls、cp、rm、find、tar 的参数边界

文件操作是 Linux 命令中使用频次最高的一类,也是最容易被手册一笔带过的一类。手册里通常只给ls -lrm -rf一行示例,但真正常用的参数和反直觉的坑都在细节里。

2.1 ls 与 stat:文件类型和权限位怎么一眼判断

ls -l输出第一列的 10 个字符经常被忽略:第一个字符是文件类型,-普通文件、d目录、l软链接;后面九个字符是三组 rwx 权限位。判断“这到底是个什么文件”,我一般不用 ls,而是用 file 和 stat:

# 读取文件头魔数判断真实类型,不信任扩展名 file /bin/bash /etc/passwd /dev/null # 查看 inode、硬链接数和时间戳 stat /var/log/app.log

file 对排查“扩展名被改掉但内容还是原格式”的文件特别有用;stat 输出的 Birth time 是创建时间,Change time 是 inode 元数据变化时间,两者在 ls 的输出里都看不到。想知道目录里最近动过哪些文件,用ls -lt按 mtime 倒序,ls -ltr反序,配合 head 或 tail 能快速定位最新与最旧条目。只看目录本身用ls -d /var/www/*/,不加 -d 会把目录内容也展开,这是新手最常犯的误用。

2.2 cp 与 rm 的安全参数:硬链接、覆盖确认与误删防护

cp 的常用姿势里,最容易出问题的是“要不要保留属性”和“要不要覆盖”。备份目录用 -a,跳过已存在文件用 -n,需要强制覆盖用 -f:

# 完整保留权限、属主和时间戳,等价于 -dR --preserve=all cp -a /data/www /backup/www # 已存在的目标文件不覆盖 cp -n config.yml config.override.yml # 同一文件系统内创建硬链接,不复制内容 cp -l original.txt link.txt

cp -l 创建的是硬链接,与原文件共享同一份数据,不占额外磁盘空间,但改了其中一个,另一个也跟着变;跨文件系统时 cp -l 会报错。cp -lf的组合含义是:-l 建硬链接,-f 在目标已存在时先移除再链接,这里的 -f 不是覆盖复制,而是替换目标文件本身。rm 这边,删除空目录用 rmdir,删除非空目录树才用rm -r,这是“Linux 删除文件夹命令”检索里最核心的区别:

# 删除前逐个确认,适合小批量操作 rm -i *.tmp # 删除目录树;GNU coreutils 默认保护根目录,但习惯上仍写完整路径 rm -rf ./build/

我见过的误删事故几乎都发生在变量展开上:rm -rf ${dir}/在 dir 为空时变成rm -rf /。脚本里写这类命令前必须set -u,删除前先 echo 打印完整目标路径;更保险的做法是先跑一遍find ... -print演练,确认列表无误再执行删除。

2.3 find 查找文件:-name、-mtime、-size、-exec 与 -prune 组合

find 是文件命令里参数最杂的一个,但日常高频的就那么几个测试条件。查找“最近 7 天内修改过的日志、排除 .git 目录”这类需求,一条命令就能覆盖:

# -mtime -7 表示 7 天以内,-not -path 排除指定路径 find /var/log -name "*.log" -mtime -7 -not -path "*/.git/*" -print # 找到每个文件后执行 chmod,{} 是文件占位符 find /data/web -type f -exec chmod 644 {} \; # 删除超过 30 天的临时文件,先去掉 -delete 演练一次 find /tmp -type f -mtime +30 -delete

find 的常用测试参数对照如下:

参数含义常见误用
-name按文件名匹配,支持通配符通配符要加引号,避免被 shell 先展开
-mtime -7修改时间在 7 天以内+30(超过 30 天)语义相反,注意符号
-type f限定普通文件不加会包含目录、软链接等所有类型
-size +100M大于 100MB单位 k/M/G 大小写敏感,混用会算错
-exec ... {} \;每条结果执行一次命令结尾的分号和括号不能丢,{}前要空格

-exec 还有{} +结尾的变体,把所有结果合并成一次执行,效率更高但有命令行长度上限;需要排除大目录时用 -prune 比 -not -path 更快,因为它不会递归进被排除的目录。

2.4 tar 打包与解压缩:归档参数对照

tar 命令的热门检索词是“打包命令”,但 tar 本身只做归档,压缩是 gzip、bzip2、xz 这些外部程序干的活,这是入门最容易混淆的概念。最小可靠命令组如下:

# 创建 tar.gz 归档,-C 先切换目录避免包内路径带绝对前缀 tar -czvf /backup/app_$(date +%F).tar.gz -C /data app # 解压到指定目录,避免文件散落在当前目录 tar -xzvf /backup/app_2025-01-12.tar.gz -C /tmp/restore # 只列出包内文件清单,不解压 tar -tzvf /backup/app_2025-01-12.tar.gz | head -20

参数含义:c 创建、x 解压、t 查看、v 显示过程、f 后跟文件名;z/j/J 分别对应 gzip、bzip2、xz 压缩算法。xz 压缩率最高但耗时最长,日常备份用 gzip 最平衡。解压时永远加 -C 指定目录,这是避免“解压一手文件到当前目录”的可靠办法。排除不需要的目录用--exclude='*.log',打包 MySQL 数据目录时我一般会把二进制日志一起排除。

3. 文本处理Linux命令:grep、awk、sed、sort 怎么配合用

文本处理是 Linux 命令的进阶分水岭。grep、awk、sed 三者各有分工:grep 找行,awk 切列,sed 改内容,配合 sort、uniq 能完成大部分日志统计需求,比打开编辑器手工处理快一个数量级。

3.1 grep 的 -E、-r、-C:搜索日志时先定范围再定模式

grep 的基本用法谁都会,差距在“递归、上下文、正则风格”三个参数上。搜日志时我一般先限定目录和文件类型,再决定用哪种正则:

# 递归搜索 ERROR,显示匹配行前后各 2 行,-n 带行号 grep -rn -C 2 "ERROR" /var/log/app/ # 扩展正则匹配 IPv4 地址,-E 下括号和竖线不需要转义 grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log # 查看非注释、非空行 grep -vE "^\s*(#|$)" /etc/nginx/nginx.conf

参数说明:-r 递归,-n 显示行号,-C 2 输出前后 2 行上下文,-v 反向匹配。-E 使用扩展正则;基础正则在 grep 里把(|当普通字符,需要转义才能当元字符,规则容易记混,日常直接用 -E 更省心。-P 走 PCRE 引擎,功能最强但性能开销大,日志文件很大时优先用 -E。还想控制文件范围时加--include='*.log'--exclude-dir=tmp,比把整个目录都搜一遍快得多。

3.2 awk 处理 CSV 和日志字段:FS、OFS、$NF

awk 的核心模型是“按行读入、按分隔符切成列、逐行处理”。处理 CSV 和日志字段时,-F 指定输入分隔符,OFS 指定输出分隔符,$NF 是最后一列:

# 按逗号分隔取第 1、2 列,输出时用竖线连接 awk -F',' 'BEGIN{OFS=" | "} {print $1, $2}' users.csv # 打印第 10 到第 20 行,NR 是行号 awk 'NR>=10 && NR<=20 {print NR": "$0}' access.log # 统计第 9 列(HTTP 状态码)的出现次数 awk '{count[$9]++} END {for (code in count) print code, count[code]}' access.log

参数说明:-F 和 BEGIN 里设置 FS/OFS 效果一样,BEGIN 适合顺便改输出格式;$NF 是当前行最后一个字段,print $2, $NF比数第几列更耐字段变动。第三个例子里 awk 用数组 count 做频次统计,END 块在全部行处理完后执行,比awk '{print $9}' | sort | uniq -c少两道管道,大量行时性能差异明显。awk 的数值比较、字符串拼接都直接写在动作块里,条件满足才执行,所以它更像微型语言而不是单条过滤器。

3.3 sed 原地改配置:-i 备份与地址范围

sed 处理配置文件替换是最高频场景,关键是“原地修改前先备份”和“地址范围别写错”:

# 替换 max_connections 行并生成 .bak 备份 sed -i.bak 's/^max_connections.*/max_connections = 500/' my.cnf # 只打印第 10 到 20 行,-n 关闭默认输出 sed -n '10,20p' access.log # 两个编辑动作:全局替换 foo,再删除空行 sed -i -e 's/foo/bar/g' -e '/^$/d' config.txt

sed 的 s 替换默认只处理每行第一个匹配,加 g 才全局;地址范围可以是行号10,20,也可以是模式/^ERROR/,还能混用。改配置类文件时必须用-i.bak这种带扩展名的写法:GNU sed 允许-i不带扩展名,但 macOS 自带的 BSD sed 要求 -i 后面必须有扩展名,脚本要跨平台时统一写-i.bak,既能兼容又能留备份。

3.4 sort、uniq、cut 组合:一行命令做访问统计

日志统计的骨架是“取字段、排序、去重计数、再排序截取”四条流水线。最典型的是统计 IP 访问次数:

# 按第 1 列统计请求次数,倒序取前 20 awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20

这串管道里每一步都不可省:awk 负责从整行里切出 IP;sort 把相同 IP 排到相邻位置,因为 uniq 只去重相邻行,不排序直接 uniq 会漏统计;uniq -c 在每行前加出现次数;第二次 sort -rn 按数字倒序。想按别的维度统计就换 awk 取的列,比如取时间字段统计每分钟请求量。cut 也能切列:cut -d' ' -f1 access.log,但日志里连续多个空格时 cut 会切出空字段,awk 遇到连续分隔符默认跳过,所以日志场景我基本只用 awk。

grep、awk、sed 的选型边界可以总结成一张表:

命令擅长不适合
grep找匹配行、计数、看上下文按列取数、跨行合并处理
awk列切割、统计、条件计算原地修改文件内容
sed替换、按地址范围删改打印复杂循环与多条件判断

4. 进程系统与网络常用Linux命令:ps、top、free、ss、systemctl

进程和网络排查是 Linux 命令价值最集中的场景。手册里这些命令多半只给“查看”示例,但实际工作中关键在“怎么定位问题”和“选哪个参数”。

4.1 ps 与 top:找出 CPU 和内存消耗者

定位机器变慢时,我第一反应是看“哪个进程在消耗资源”,而不是先重启服务。ps 输出全部进程并按 CPU 排序是最快的入口:

# 按 CPU 占用降序,取前 20 个进程 ps -eo pid,ppid,%cpu,%mem,comm --sort=-%cpu | head -20 # top 批处理模式,按内存排序输出一帧 top -bn1 -o %MEM | head -25

ps 的 -e 表示所有进程,-o 自定义输出列,--sort=-%cpu 按 CPU 降序;想看内存就改成 --sort=-%mem。top 交互模式下按 P 切 CPU 排序、按 M 切内存排序、按 H 切线程视图;脚本里用 -bn1 输出一帧后退出,-o %MEM 直接按内存排好。比 top 更细的是 pidstat:pidstat -u -p PID 1 5连续采样 5 秒,看单进程 CPU 波动比 top 截图更直观。

4.2 free -h 详解:buff/cache 与 available 的区别

free -h 的输出是排查内存问题被误读最多的地方,核心是分清三列:

free -h total used free shared buff/cache available Mem: 15Gi 6.2Gi 1.8Gi 212Mi 7.5Gi 8.2Gi Swap: 2.0Gi 0B 2.0Gi

字段说明:used 是进程实际占用;free 是完全未使用的内存;buff/cache 是内核用空闲内存做的磁盘缓存,这部分在内存紧张时会被内核自动回收,所以判断“内存够不够”应该看 available,它是“不触发交换的情况下还能分配多少”的口径。当 free 只剩 1.8G 而 available 还有 8.2G 时,机器完全正常。真正要查内存泄漏时,配合ps -eo pid,rss --sort=-rss | head看单进程 RSS 增长,再持续采样 /proc/meminfo 里的 MemAvailable 字段,比盯 free 一帧输出更可靠。

4.3 ss 与端口排查:3306端口白名单的查询和放行

排查“3306 端口连不上”这类问题时,先确认监听,再确认防火墙。ss 替代 netstat 是当前主流做法,参数语义基本兼容:

# 查看 3306 端口谁在监听,-p 显示进程名 ss -lntp | grep 3306 # 查看全量 TCP 连接状态统计 ss -s # 用 nc 探测目标端口是否可连 nc -zv 192.168.1.20 3306

ss 参数说明:-l 只显示监听中的 socket,-n 不做 DNS 反解(速度快很多),-t 限定 TCP,-p 显示进程。加了 -p 需要 root 权限才能看到别人的进程,排查连不上时先确认权限。nc 的 -z 表示只探测不发送数据,-v 输出详细结果,适合脚本里做连通性判断。确认监听正常但外部连不上,就要查防火墙。只放行 192.168.1.0/24 网段访问 3306,firewalld 的精确写法是 rich rule:

# 放行指定网段访问 3306,修改后必须 reload 才生效 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept' firewall-cmd --reload

rich rule 比 add-port 多一个 source 限定,能精确到源网段,代价是语法长。同属网络传输的 scp 也经常在这步出现:指定端口用大写 -P,scp -P 2222 app.tar.gz deploy@10.0.0.9:/tmp/;小写 -p 在 scp 里是保留时间戳,两者写反是最高频的报错来源。

4.4 systemctl 与 kill 信号:停服务不要只会 kill -9

停进程是另一个被手册带偏的场景。许多教程张口就是 kill -9,但它绕过了进程的所有清理逻辑,应该放在最后而不是第一步:

信号默认动作常用场景
TERM(15)终止进程默认 kill,允许进程清理资源后退出
HUP(1)终止进程守护进程约定:重读配置不重启
INT(2)终止进程等同终端 Ctrl+C
KILL(9)强制终止捕获不了也清理不了,进程卡死时才用
# 优雅停止与强制杀死 kill -TERM 1234 kill -KILL 1234 # 按名字找 pid,-f 匹配完整命令行 pgrep -f "uwsgi master"

kill 默认发 SIGTERM,应用收到后有机会落盘、关连接;HUP 在 nginx、sshd 这类守护进程里约定为重读配置;只有进程完全无响应才用 KILL。systemd 管理服务时,systemctl reload nginx不中断连接地重读配置,restart 会短暂中断服务,改配置不确定能不能生效时优先 reload。查用户和组时用 getent 而不是直接 cat:

# 列出所有用户和所有组 getent passwd getent group

getent 查询的是 NSS 配置里配置的数据源,不只是 /etc/passwd,在多数据源环境比 cat 更可靠;只查当前用户信息用 id,uid、gid 和所属组一次输出到位。

5. 并行执行Linux命令与自建命令手册:把命令集变成自己的

命令集手册的价值最后要落在“能不能加速日常操作”上。两个技巧能带来质变:并行执行提升批处理效率,alias、函数加检索脚本把命令集固化到自己的环境里。

5.1 xargs -P 并行执行:控制并发数而非无脑后台

批量处理文件时,新手喜欢在命令后面加 & 加 wait,更可控的方式是 xargs 的 -P 参数:

# 并行压缩 16 个日志文件,最多同时跑 4 个 gzip ls /var/log/app/*.log | xargs -P 4 -I {} gzip {} # 逐行读取 IP 列表并发执行,-n 1 表示每条命令消费一行 cat ip_list.txt | xargs -P 10 -n 1 -I {} ssh {} 'uptime'

参数说明:-P 4 限制并发进程数,不设的话会全部同时跑,瞬间打满 CPU 或 IO。-I {} 把每条输入替换到命令的任意位置,-n 1 控制每次取多少条输入。并行输出的最大问题是错乱——多个进程同时往终端写,行会互相穿插,需要保留输出时就重定向到按任务名命名的文件。逻辑更复杂的场景用显式后台循环:

for f in /var/log/app/*.log; do gzip "$f" & done wait

wait 等待本轮所有后台任务结束,适合需要统一收尾的脚本。文件名带空格时,xargs 默认按空白切分,要配合find ... -print0xargs -0使用,这是处理含空格文件名的标准做法。

5.2 用 alias、函数和检索脚本沉淀个人 Linux 命令集

把高频命令固化成自己的别名和函数,比每次翻手册快得多。我会在 ~/.bashrc 里维护一组:

# 高频别名:按时间倒序列文件、查看监听端口 alias ll='ls -lhtr' alias ports='ss -lntp' # 函数:按名字找近期日志,第二个参数不传默认 7 天 function findlog() { find /var/log -name "$1" -mtime -${2:-7} -type f -print }

alias 适合单条命令,函数适合带参数和默认值的场景,${2:-7}表示第二个参数没传时用 7。逐行处理文件时用while read -r line; do ...; done < file这个骨架,read 从文件里逐行读取,配合脚本里的命令串起来就是完整的批处理工具链。个人命令集还需要检索入口,一个几十行的笔记文件加一个 grep 包装函数,就是最轻量的命令手册引擎:

# ~/bin/lman:从自己的命令笔记里检索 #!/usr/bin/env bash grep -iE "$1" ~/.local/share/linux-commands.md

验证这套流程是否生效,执行下面三步:

chmod +x ~/bin/lman source ~/.bashrc findlog access.log 1

chmod 给 lman 加执行权限,source 让新别名和函数在当前 shell 生效,findlog 的第二个参数 1 表示只找最近 1 天改动的文件。确认输出正常后,把 lman、.bashrc、linux-commands.md 放进同一套备份目录,每次踩坑就往笔记里追加一条带示例的记录,个人命令集就彻底脱离 PDF 手册,变成随环境迁移的可执行资产了。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询