1. 学到第4天,才算真正摸到Linux的门
如果你也在自学Linux,并且一路坚持到了第4天,先给自己鼓个掌。这个阶段很微妙:你不是完全的小白,但也远谈不上熟练,更像是一个刚拿到驾照的人,知道油门刹车在哪,但还没上过高速。今天这第4天,按我的经验来看,是一个分水岭——前3天你学的是“怎么跟Linux打交道”,从今天开始,你要学的是“怎么让Linux帮你干活”。
我今天的学习主线很明确:权限管理、文本处理三剑客的入门、以及玩明白重定向和管道。这几个东西单拎出来每一个都是重点,组合起来就是Linux日常操作的骨架。第4天学完,你会发现自己能看懂很多命令行的操作逻辑了,而不是像前几天那样全靠死记硬背。
顺便说一句,我在学习过程中查资料、搜命令,发现网上所谓的“Linux命令大全”五花八门,几百条命令砸过来反而让人焦虑。我的建议是:别贪多,第4天这个阶段,把今天这几个核心模块吃透,比泛泛浏览一百条命令有用得多。废话不多说,直接进入今天的学习记录和踩坑复盘。
2. 第4天的核心思路:用“最小可用系统”打通知识闭环
2.1 为什么第4天要选权限、管道和文本处理?
很多人学到第4天会陷入一个误区——开始背命令参数大全,什么“tar的20个参数”“awk的30个用法”,背得昏天黑地,结果一上手实操还是懵。
我的理解和很多教程不一样。第4天最适合学的,是一套能把前3天知识串起来的“最小可用系统”。什么叫最小可用系统?就是你用今天学的东西,能完整地完成一个真实的小任务。比如:创建一个项目目录、给团队成员分配不同权限、从一堆日志文件里找出错误信息并统计数量。这个过程中你会自然而然地用到权限命令(chmod、chown)、查找命令(find、grep)、重定向和管道——这些恰恰就是Linux日常使用频率最高的核心操作。
从认知规律来说,第4天也是记忆曲线的关键节点。前几天学的命令如果不通过实际任务来巩固,很快就会忘。权限、管道、文本处理这三块内容彼此关联度极高:权限需要操作文件,管道需要串联命令,文本处理需要读取文件内容——刚好把前3天的文件操作、目录操作、命令查询全部复习一遍。选这个组合作为第4天,性价比是最高的。
2.2 我对自己学习效果的两个硬性验收标准
今天学完后我有一个明确的检测方法,也分享给你们,可以拿来检验自己是不是真的掌握了:
- 标准一:不查资料,自己动手创建一个用户、给一个目录设置到770权限、然后用另一个用户测试是否无法进入,最后通过命令将该用户加入对应的用户组后再测试是否可以进入。这套流程走通,权限这关就算过了。
- 标准二:给我50个日志文件(任意格式的文本),我能用一条管道命令组合出“每个文件里包含error关键字的行数排名前5的列表”。能独立完成这个,说明管道和文本处理的基本功到位了。
这两个标准听起来简单,实际操作中会串联出十几个小知识点,任何一个环节卡住都得回头翻资料。但正是这种“逼自己闭环”的学习方式,能让你真正把知识变成自己的。
3. 权限管理:从“知道chmod”到“理解权限模型”
3.1 权限的本质:Linux为什么非要搞这么复杂?
第4天我花最多时间的就是权限管理。很多新手会觉得权限系统很烦人,“我自己的电脑凭什么不让我随便删文件?”但这个认知是错的——Linux从设计之初就是多用户、多任务的操作系统,权限机制不是限制你,而是保护你。
我给你们打个比方。权限系统就像一栋办公楼的安保系统。大楼管理员(root用户)拥有所有房间的钥匙,普通员工(普通用户)只能进自己的办公室。有些房间是公共会议室,所有员工都能进,但只有保洁阿姨(目录属主)才有权重新布置家具。如果你把整栋楼所有的门禁都取消,任何一个员工都能进CEO办公室翻文件,那你放心吗?Linux服务器的场景下,情况更严重——你的服务器上可能跑着网站、数据库、多个用户的数据,一旦权限失控,轻则数据被误删,重则被入侵者利用。
理解了这一层,你就明白为什么第4天必须死磕权限。这不仅是考试题,更是真实生产环境里保命的技能。
3.2 读透“rwx”和数字权限:用一套数学逻辑替代死记硬背
今天学到的第一个核心概念,是Linux文件权限的三组九位表示法。什么意思呢?你用ls -l命令看一个文件,最前面那一串字符是这样的:
-rw-r--r--这一串字符看起来诡异,但拆开就很简单。第一位表示文件类型,-代表普通文件,d代表目录,l代表链接文件。后面九位分成三组,每组三位:
- 第一组:文件属主(owner)的权限
- 第二组:属主所在组(group)的权限
- 第三组:其他用户(others)的权限
每组三位分别是r(读)、w(写)、x(执行)。有对应的权限就显示字符,没有就用-代替。
那数字权限又是什么?简单说就是把r记为4,w记为2,x记为1,没有权限记0。把一组的三个数字加起来,就是这个组的权限值。比如rwx就是4+2+1=7,rw-是4+2+0=6,r--是4+0+0=4。
注意一个很容易踩的坑:很多人觉得
7就是“完全权限”的意思,就直接把 chmod 777 扔上去用。但生产环境里这是大忌。目录用 777,意味着任何人都能在这个目录里新建和删除文件,如果这个目录是网站的上传目录,那后果不堪设想。正确做法是:尽量往小的权限设置,够用就好。
今天我自己练手的时候,做了这么一组实验:
mkdir test_project touch test_project/readme.md chmod 754 test_project/readme.md ls -l test_project/readme.md输出结果:
-rwxr-xr-- 1 user user 0 Feb 20 10:30 test_project/readme.md这个754拆解下来就是:属主可以读写执行(7),组成员可以读和执行(5),其他用户只能读(4)。在真实场景里,这种权限设置很常用——比如网站项目的配置文件,属主可以改,同一开发组成员可以查看和执行,外部用户只能读。
3.3 目录权限的“反直觉”坑:为什么r和x要成对出现?
今天的第二个大知识点,是目录权限和文件权限的差别。这里我差点绕晕,后来用一个小实验才彻底搞明白。
文件的r和x很好理解,一个是读内容,一个是执行。目录就完全不一样了:
- 目录的
r:能否列出目录里的文件名列表 - 目录的
w:能否在目录里新建、删除、重命名文件 - 目录的
x:能否进入目录(cd进去),以及能否访问目录里文件的具体属性(比如通过绝对路径访问子文件)
最坑的点在于:对一个目录来说,如果只有r没有x,你虽然能用ls看到目录里有几个文件,但看不到任何文件的详细信息,也进不去这个目录。如果只有x没有r,你能进去,但看不到里面有什么,只能凭文件名猜。
所以实际使用中,目录一般至少要有r-x(读+执行)。常见的目录权限组合是:
| 目录权限 | 含义 | 使用场景 |
|---|---|---|
| 755 | 属主可读写执行,组和其他人可读可执行 | 网站根目录、公共资源目录 |
| 750 | 属主可读写执行,组可读可执行,其他人无权限 | 项目代码目录(组内协作) |
| 700 | 仅属主可读写执行 | 隐私目录、密钥目录 |
| 1777 | 属主可读写执行,组和其他人可读可执行,加上粘滞位 | /tmp 这类共享临时目录 |
最后那个1777里的1是“粘滞位”,它的作用是:在这个目录下,只有文件属主或者root才能删除自己的文件。最典型的就是/tmp目录,所有用户都可以在里面创建临时文件,但不允许随便删别人的文件。这个属于进阶内容,今天了解即可,但面试和实际工作中经常会遇到。
3.4 chown和chmod配合使用:实操中的完整闭环
光会改权限还不够,还得会改属主和属组。第4天我搭了一个模拟场景来练手:
场景描述:构建一个名为project_a的目录,要求:一个叫alice的用户和一个叫barry的用户都能在这个目录下建文件,但barry只能编辑自己创建的文件,不能删alice创建的,反之亦然。
这个需求在企业里非常常见——多个同事协作一个目录,但互相不能乱动对方的文件。解决办法就是Linux里的“粘滞位”,我刚才提到过:
# 1. 创建目录 mkdir /home/share/project_a # 2. 把目录的属主/属组设置为公共组 chown root:devteam /home/share/project_a # 3. 设置权限为 1777 chmod 1777 /home/share/project_a # 4. 确认结果 ls -ld /home/share/project_a关键点:把两个用户都加入devteam组,目录的属组设为devteam,然后再给目录加上粘滞位。这样团队内任何人创建的临时文件,只有自己有权删除,但大家都能在目录里读写文件和新建文件。
实操心得:如果你只设置了 777 权限但忘了加粘滞位,就会出现“我辛苦写了半天的文件被同事一条 rm 命令误删了”的悲剧。服务器上这种情况真要命,所以以后我做共享目录,粘滞位是默认必加的。
4. 重定向与管道:Linux的“命令组合技”
4.1 标准输入输出的三兄弟:别再把重定向当玄学
权限学完,我进入今天第二个大模块:重定向与管道。先说重定向,四个符号记清楚就能覆盖95%的使用场景:
>:标准输出重定向(覆盖写)>>:标准输出重定向(追加写)2>:错误输出重定向<:标准输入重定向
什么叫标准输出和错误输出?Linux里命令执行会有两个出口——正常的结果走“标准输出”(屏幕),报错信息走“标准错误输出”(也是屏幕上,但分开算)。如果你只想把正常结果存进文件,错误信息留在屏幕上,就可以这样:
# 把正常输出写入文件 ls /etc > etc_list.txt # 把错误信息也写入文件 ls /etc 2> error.log # 把正常输出追加到文件末尾 echo "hello world" >> etc_list.txt新手最容易踩的坑:以为>和>>没区别。实际上>每次都会把目标文件清空再写入,如果文件里有重要内容,一条命令就把你全毁了。我今天练习时就干过这事——本想把命令输出追加到一个笔记文件里,结果用了>直接把之前的笔记清空了,欲哭无泪。所以“高危操作”里面,>绝对排得上号。
那如果我想同时把正常输出和错误输出都存到文件里呢?标准写法:
command > output.log 2>&1这段代码里的2>&1表示“把错误输出(2)重定向到和标准输出(1)一样的地方”。注意顺序不能反,必须先>output.log再2>&1,反了就会出错。
4.2 管道:像流水线一样组合命令
管道符号是|,作用是把左边命令的输出,作为右边命令的输入。这就像是工厂里的流水线:第一个工序完成半成品,第二个工序接着加工。
举个今天练过的例子,统计/var/log/目录下有多少个.log文件:
ls /var/log/ | wc -l简单来说,ls /var/log/会把目录里的文件名全部列出来,wc -l统计行数。结果就是文件数量。
更实用一点的场景:找某个端口被什么进程占用:
netstat -tunlp | grep 8080这里netstat输出所有端口监听状态,grep 8080过滤出包含8080的行。一条命令搞定问题排查,比一个个翻输出高效得多。
再进阶一点,管道是可以串联很多层的。比如我想看看系统里有多少个普通用户:
cat /etc/passwd | cut -d: -f1 | grep -v '^#' | tail -n +11这段代码的每个环节:cat读取用户文件,cut按冒号拆分取第一个字段(用户名),grep -v去掉注释行,tail跳过前10个系统自带用户。四段接力,每一段都在上一个工序的输出上做加工。
我的学习心得:管道用得好不好,关键在于“能不能想到把两个不相关的命令组合起来”。这需要积累。我给自己定了一个规矩:每次学新命令,翻一下它的帮助文档,想一想它能输出什么格式的内容,这个内容会不会是另一条命令想吃的“食材”。想多了,组合技自然就通了。
4.3 tee命令:一边看输出一边存文件
今天还学了一个特别实用的小工具tee,名字就很有意思——T型水管,两头分流。它的作用是:把输出同时“分流”到屏幕和文件。
# 运行命令,结果既显示在屏幕,又保存到文件 ls -l /etc | tee etc_list.txt这里的技巧在于,tee在工作流程中非常有用。比如你要在一台服务器上跑一个可能需要很长时间的部署脚本,又不想干等着看不到输出,也不想让输出刷屏刷到看不了历史记录,就可以用tee把实时输出记录下来:
./deploy.sh | tee deploy_log_$(date +%Y%m%d).log配上date命令生成带日期的日志文件名,以后每次部署都有一份完整的日志存档,排查问题的时候翻日志比回忆管用得多。这个习惯我现在已经养成了,强烈推荐。
5. 文本处理三剑客入门:grep、find、cut的实战组合
5.1 grep:不只是“查找关键字”这么简单
网上流传的“Linux命令大全”里面,grep一定会被列在前排。但很多人对grep的理解停留在一个层面:grep "关键字" 文件。这个理解没错,但远远不够。
今天我用一个真实的运维场景来练 grep:某个服务把日志写在了/var/log/myapp/目录下,每天一个文件,我想找出所有带ERROR的行,并且统计一下今天出现了多少次:
# 在目录里递归查找所有文件,找到包含ERROR的行 grep -r "ERROR" /var/log/myapp/ # 只统计行数 grep -r "ERROR" /var/log/myapp/ | wc -l # 带上行号,方便定位 grep -rn "ERROR" /var/log/myapp/ # 忽略大小写 grep -ri "error" /var/log/myapp/-r递归子目录、-n显示行号、-i忽略大小写,这三个参数是我日常最高频的组合。另外一个特别使用的参数是-A和-B,用来显示匹配行后面或前面的几行上下文:
# 显示ERROR行以及后面的3行(通常后面跟着堆栈信息) grep -A 3 "ERROR" /var/log/myapp/app.log排查问题的时候,只看一行错误往往不够,上下文里往往藏着真正的崩溃原因,这个参数能帮你节省大量时间。
5.2 find:定位文件的终极武器
find命令负责根据文件名、类型、大小、修改时间等条件查找文件。这里我分享今天最常用的几个组合。假设你的项目目录里堆积了大量临时文件,想找到所有超过100MB的.tar文件:
find /home/user/downloads -name "*.tar" -size +100M不想直接删,先看数量:
find /home/user/downloads -name "*.tar" -size +100M | wc -l这时候可以用管道和xargs直接删除,但删除前我强烈建议先-print打印文件名确认一下:
find /home/user/downloads -name "*.tmp" -delete-delete参数一键删除,你敢用吗?我不敢。我今天是这么处理的:
find /home/user/downloads -name "*.tmp" -exec ls -lh {} \;这条命令里的-exec参数会对每一个找到的文件执行后面的命令,{}代表当前文件名。先看列表确认无误,再把ls -lh换成rm -f:
find /home/user/downloads -name "*.tmp" -exec rm -f {} \;注意:在自己的学习环境里随便折腾没关系,但生产环境里
find -exec rm是典型的高危命令。我给自己定的规矩是:任何删除动作,第一次先执行“只列出不删除”版本,人工确认后再执行真正的删除。宁可多花一分钟,不要手滑一秒钟。
还有一个十分常用的 find 场景,按时间查找。比如查过去7天内修改过的配置文件:
find /etc -name "*.conf" -mtime -7-mtime -7表示修改时间在7天以内,如果你看到-mtime +7那就是7天之前。这个参数在做定期清理临时文件时能救命。
5.3 cut:结构化的文本切片工具
cut命令的作用是按“列”来切割文本,和 grep 按“行”过滤正好互补。我最常用的参数是-d(指定分隔符)和-f(取第几列)。
比如/etc/passwd文件里的每一行格式是用户名:x:UID:GID:描述:家目录:登录shell,用冒号分隔,我想看所有用户的用户名和登录shell:
cut -d: -f1,7 /etc/passwd输出长这样:
root:/bin/bash daemon:/usr/sbin/nologin www-data:/usr/sbin/nologin alice:/bin/bash这个输出直接告诉我:哪些用户可以正常登录,哪些是服务账号(nologin表示禁止登录)。配合 grep 一起用,就能方便地筛选出所有能登录的普通用户:
grep -v "nologin" /etc/passwd | cut -d: -f1grep -v "nologin"干掉所有含 nologin 的行,剩下的行再交给cut取用户名,一条命令解决问题。
今天练的最复杂的一个组合题是这样的:
将当前目录下所有
.conf文件里包含server_name的行找出来,提取出这些配置的域名,按字母排序,并统计数量。
做法:
grep -r "server_name" --include="*.conf" . | awk '{print $2}' | sort | uniq -c这里引入了一个awk的内容,今天我只用了它最基础的功能——按空格切分并打印第2个字段。完整解释:grep -r递归查找所有.conf文件包含server_name的行,awk '{print $2}'打印每行的第二个字段(域名),sort排序,uniq -c统计重复次数。一条命令的流水线,从一堆配置里提取出了很直观的统计报告。
5.4 head、tail、wc:流量分析的“三大件”
文本处理离不了head(看头部)、tail(看尾部)、wc(统计数量)。它们单独用很简单,组合起来威力很大。
比如查看最新日志文件的最后50行,并持续监控新的输出:
tail -f /var/log/system.log-f表示“跟随”(follow),文件有新内容时会实时打印到终端。这是排查线上问题的利器——开着这个窗口,复现问题,你能实时看到日志刷出来的错误。
再比如,想把一个超大日志文件的最后5000行截取出来,单独存成一个文件来分析,避免整个文件太大打开卡死:
tail -n 5000 /var/log/huge.log > last_5000_lines.log这里就串联了今天的两个知识点:tail取尾部5000行,>重定向写入新文件。这个操作在分析数GB超大日志时非常实用。
wc -l则是快速统计行数的,前面已经用过多次。加上-c还能统计字节数,-w统计单词数,用起来非常灵活。
6. 头歌风格练习:一晚上能做完的命令闯关题
6.1 六道渐进式练习题(附思路和参考答案)
网上很多教程的练习题我都不喜欢,因为它们只是在验证“你记住了吗”,而不是在训练“你会不会用”。今天学完所有内容后,我给自己设计了六道闯关题。你们也可以照着做一遍,做完对答案,比单纯看书效果好得多。
第一题:在当前目录下创建一个名为linux_day4的目录,并在其中创建logs和backup两个子目录。
mkdir -p linux_day4/logs linux_day4/backup-p参数会一次性创建多层目录,不需要分两步执行。有些教程会让你mkdir linux_day4 && cd linux_day4 && mkdir logs backup,也能实现,但-p更简洁。
第二题:在linux_day4/logs下生成一个包含100行测试文本的文件,内容格式为INFO 2026-02-20 10:00:00 request completed 第N条,N从1到100。
seq 1 100 | awk '{printf "INFO 2026-02-20 10:00:00 request completed 第%d条\n", $1}' > linux_day4/logs/app.logseq 1 100生成1到100的数字,awk负责按格式拼装文本,最后重定向写入文件。这一题已经需要用管道和格式化输出了。
第三题:基于第二题生成的日志文件,统计request completed出现的总次数。
grep -c "request completed" linux_day4/logs/app.log答案是100。如果不知道grep -c,也可以用grep "..." | wc -l,两条命令本质相同。
第四题:把日志文件中第51行到第70行的内容提取出来,保存为一个新文件part2.log。
sed -n '51,70p' linux_day4/logs/app.log > linux_day4/backup/part2.log这里用到了sed的地址范围打印功能。第4天你们还没正式学sed,但这个用法非常简单且高频,可以先混个脸熟:-n关闭默认输出,'51,70p'表示“打印51到70行”。
第五题:把part2.log按行号反序输出。
tail -r linux_day4/backup/part2.logtail -r在某些系统版本上可能不支持,备选方案是tac命令(cat倒着写),本质一样。
第六题:找出linux_day4/logs/app.log内容中所有“INFO”所在行的行号。
grep -n "INFO" linux_day4/logs/app.log | cut -d: -f1grep -n会输出“行号:内容”的格式,再用cut按冒号切分取第一个字段,就得到了纯行号列表。这里用到了第5.3节说的cut,算是一次综合运用。
6.2 做完练习后我做的一次“复盘式复习”
六道题做完花了大概40分钟。做完之后我没有急着开始新内容,而是做了一次很关键的复盘——把所有今天用过且不熟的命令,手写在一个本子上。是的,手写。敲键盘不管用,必须用笔写一遍,记忆才更牢固。
我整理了一张速查表,你们也可以抄走。别嫌简单,第4天能完整掌握这些,你已经超过了很多人。
| 命令 | 重要参数/用法 | 典型场景 |
|---|---|---|
| chmod | 数字权限、-R递归 | 调整文件/目录访问权限 |
| chown | user:group、-R递归 | 修改文件属主和属组 |
| grep | -r、-n、-i、-c、-A | 文本检索与日志排查 |
| find | -name、-size、-mtime、-exec | 按条件定位文件 |
| cut | -d分隔符、-f字段 | 文本切片提取 |
| tail | -f、-n | 查看日志末尾/实时监控 |
| wc | -l、-c、-w | 统计行数/字数 |
| tee | 直接输出并保存 | 兼顾实时查看与日志记录 |
| sort、uniq | 按列排序、-c去重计数 | 数据统计 |
7. 今天踩过的坑和避坑心得
7.1 踩坑实录一:把>当>>用,日志文件被清空
这个坑我在前面提过,但值得单独展开说一说。今天练习的时候,我本来想把一条查询结果追加到笔记文件里,结果写成了:
ls /home/user/project >> notes.txt注意这里用的是>>,没问题。但后来有一次我写成了:
ls /home/user/project > notes.txt直接覆盖了原来的笔记内容。当时我整个人都愣住了,然后才反应过来——>是覆盖,>>才是追加。这个教训让我长了记性:每次写完重定向符号,我都会停下来默念一遍“这是覆盖还是追加”,确认无误再按回车。别笑,这个方法挽救了我后面好几次数据丢失事故。
7.2 踩坑实录二:chmod递归修改时把执行权限误加给所有文件
今天还干过一件蠢事。我想把项目目录的权限整体调成755,于是用了:
chmod -R 755 /home/user/myproject/结果这个目录下所有文件都被赋予了执行权限。对目录来说执行权限是合理的,但对普通文本文件来说,执行权限毫无意义,而且只要权限是755,就意味着所有人(包括其他系统用户)都能读取你的源码文件。如果服务器上还跑了别的服务,就存在信息泄露的风险。
正确的做法是,除非确实需要,否则不随意对整个目录-R改权限。如果真要改,也应该分清楚目标:目录需要x,普通文件不需要。规范的操作是:
find /home/user/myproject -type d -exec chmod 755 {} \; find /home/user/myproject -type f -exec chmod 644 {} \;用find把目录和文件分开处理,目录755、文件644,这是业界常规做法。因为文件644已经能保证属主可读写、组和其他人可读,日常场景完全够用。
7.3 踩坑实录三:grep递归查找遇到二进制文件
用grep -r查找关键字的时候,如果目录里有二进制文件,会出现一堆乱码输出。一开始我还以为是文件内容有什么奇怪编码,后来才知道grep默认会把二进制文件也扫一遍,然后输出“binary file matches”之类的内容。
解决办法是在 grep 命令里加上-I参数,专门跳过二进制文件:
grep -rnI "ERROR" /var/log/myapp/-I会让 grep 忽略二进制文件,这样输出就会干净很多。
7.4 常见问题速查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
Permission denied | 文件/目录权限不够 | ls -l查看权限,临时用sudo验证 |
command not found | 命令不在PATH中 | which 命令名检查,用绝对路径执行 |
| 文件内容被莫名清空 | 用了>而非>> | 平时养成用>>的习惯,关键操作前备份 |
grep报binary file matches | 扫描到二进制文件 | 加-I参数跳过 |
rm删除时提示目录非空 | 没有用-r | 确认无误后加-r递归删除 |
| 中文文件名乱码 | 字符集设置问题 | locale检查系统语言环境 |
这些坑踩过一遍,比你看十遍教程印象都深。第4天学习的过程中,我最大的感受是:Linux学习没有捷径,但一定有方法论。死记命令参数列表是最差的学习方式,把命令放进真实任务里去用,才是最高效的路径。
今天最后再分享一个我喜欢的小习惯:每天学习结束后,我都会挑一条今天用过的命令,把它扩展成一篇两三句话的“命令笔记”,记录它解决的实际问题、使用的参数、以及踩过的坑。日积月累,这本笔记就变成了我自己的“命令案例库”,比任何网上的命令大全都实用。第4天学完,你们也可以试试。