ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux常用命令详解:文件操作、文本处理与进程网络排查

Linux常用命令详解:文件操作、文本处理与进程网络排查 简介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 -l和rm -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.logfile 对排查“扩展名被改掉但内容还是原格式”的文件特别有用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 --preserveall cp -a /data/www /backup/www # 已存在的目标文件不覆盖 cp -n config.yml config.override.yml # 同一文件系统内创建硬链接不复制内容 cp -l original.txt link.txtcp -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 -deletefind 的常用测试参数对照如下参数含义常见误用-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-dirtmp比把整个目录都搜一遍快得多。3.2 awk 处理 CSV 和日志字段FS、OFS、$NFawk 的核心模型是“按行读入、按分隔符切成列、逐行处理”。处理 CSV 和日志字段时-F 指定输入分隔符OFS 指定输出分隔符$NF 是最后一列# 按逗号分隔取第 1、2 列输出时用竖线连接 awk -F, BEGIN{OFS | } {print $1, $2} users.csv # 打印第 10 到第 20 行NR 是行号 awk NR10 NR20 {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.txtsed 的 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 负责从整行里切出 IPsort 把相同 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 -25ps 的 -e 表示所有进程-o 自定义输出列--sort-%cpu 按 CPU 降序想看内存就改成 --sort-%mem。top 交互模式下按 P 切 CPU 排序、按 M 切内存排序、按 H 切线程视图脚本里用 -bn1 输出一帧后退出-o %MEM 直接按内存排好。比 top 更细的是 pidstatpidstat -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 3306ss 参数说明-l 只显示监听中的 socket-n 不做 DNS 反解速度快很多-t 限定 TCP-p 显示进程。加了 -p 需要 root 权限才能看到别人的进程排查连不上时先确认权限。nc 的 -z 表示只探测不发送数据-v 输出详细结果适合脚本里做连通性判断。确认监听正常但外部连不上就要查防火墙。只放行 192.168.1.0/24 网段访问 3306firewalld 的精确写法是 rich rule# 放行指定网段访问 3306修改后必须 reload 才生效 firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.0/24 port protocoltcp port3306 accept firewall-cmd --reloadrich rule 比 add-port 多一个 source 限定能精确到源网段代价是语法长。同属网络传输的 scp 也经常在这步出现指定端口用大写 -Pscp -P 2222 app.tar.gz deploy10.0.0.9:/tmp/小写 -p 在 scp 里是保留时间戳两者写反是最高频的报错来源。4.4 systemctl 与 kill 信号停服务不要只会 kill -9停进程是另一个被手册带偏的场景。许多教程张口就是 kill -9但它绕过了进程的所有清理逻辑应该放在最后而不是第一步信号默认动作常用场景TERM(15)终止进程默认 kill允许进程清理资源后退出HUP(1)终止进程守护进程约定重读配置不重启INT(2)终止进程等同终端 CtrlCKILL(9)强制终止捕获不了也清理不了进程卡死时才用# 优雅停止与强制杀死 kill -TERM 1234 kill -KILL 1234 # 按名字找 pid-f 匹配完整命令行 pgrep -f uwsgi masterkill 默认发 SIGTERM应用收到后有机会落盘、关连接HUP 在 nginx、sshd 这类守护进程里约定为重读配置只有进程完全无响应才用 KILL。systemd 管理服务时systemctl reload nginx不中断连接地重读配置restart 会短暂中断服务改配置不确定能不能生效时优先 reload。查用户和组时用 getent 而不是直接 cat# 列出所有用户和所有组 getent passwd getent groupgetent 查询的是 NSS 配置里配置的数据源不只是 /etc/passwd在多数据源环境比 cat 更可靠只查当前用户信息用 iduid、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 waitwait 等待本轮所有后台任务结束适合需要统一收尾的脚本。文件名带空格时xargs 默认按空白切分要配合find ... -print0和xargs -0使用这是处理含空格文件名的标准做法。5.2 用 alias、函数和检索脚本沉淀个人 Linux 命令集把高频命令固化成自己的别名和函数比每次翻手册快得多。我会在 ~/.bashrc 里维护一组# 高频别名按时间倒序列文件、查看监听端口 alias llls -lhtr alias portsss -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 1chmod 给 lman 加执行权限source 让新别名和函数在当前 shell 生效findlog 的第二个参数 1 表示只找最近 1 天改动的文件。确认输出正常后把 lman、.bashrc、linux-commands.md 放进同一套备份目录每次踩坑就往笔记里追加一条带示例的记录个人命令集就彻底脱离 PDF 手册变成随环境迁移的可执行资产了。本文还有配套的精品资源点击获取
返回列表