ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux第4天:重定向、管道与文本处理命令实战指南

Linux第4天:重定向、管道与文本处理命令实战指南 今天是开始系统学习Linux的第4天先说点实在的前面3天我基本都在跟文件、目录、权限打交道ls、cd、cp、mv、rm这些命令已经能闭着眼敲出来chmod、chown改权限也还算熟练。但说实话那几天我一直有一种“只会在迷宫里走路但看不清地图”的感觉。直到第4天开始碰重定向、管道和文本处理命令我才真正觉得Linux的壳被撬开了一道缝。如果你也正在自学Linux或者正在服务平台上的Linux在线课程里一课一课刷这篇文章大概能帮上忙。它不追求大而全就围绕我第4天做的三件事展开搞懂重定向和管道、掌握grep等文本处理命令、用组合命令解决实际问题。我会把命令、原理、踩坑和排查方法都写清楚方便你直接照着练。1. 第4天的学习主线从“会用命令”到“让命令协同工作”1.1 为什么第4天要开始碰重定向、管道和文本处理前面3天学的命令本质上都是“单个命令完成单个动作”列出目录、复制文件、修改权限。但真实工作场景里几乎不会有人只敲一条命令就收工。比如你想知道日志文件里哪个IP访问次数最多单靠cat或者grep都不够你得把好几条命令用管道串起来让它们像流水线一样各干一段。这正是第4天要解决的核心问题。重定向和管道是Linux“一切皆文件”哲学的集中体现。命令的输出可以不再只显示在屏幕上而是写到文件里或者直接交给另一条命令继续处理。这一步跨过去之后你手里那些零散命令就有了组合的价值就像单个乐高积木虽然也能玩但只有按图纸拼到一起才有真正的结构感。另外我第4天还开始系统整理自己的“lunix命令大全”笔记。之前几天我是边查边记比较零散这天开始按功能分类把重定向、管道、grep、sed、awk这些处理文本的高频命令汇总成一张速查表。这个习惯回头来看非常值越到后面越觉得有一份自己的命令手册比什么都强。1.2 第4天的学习目标适合谁如果你和我一样已经学完文件操作、目录结构、基础权限日程表上正打算推进到日志分析、系统管理或者写点脚本那么这个阶段的内容就是你的必经之路。哪怕是只想在服务器上查查日志、改改配置的人也需要掌握管道和文本处理否则遇到稍微复杂一点的需求就只能干瞪眼。我也是通过平台上的仿真实训题来检验自己能否独立完成这些操作。头歌或者其他类似实训平台这类网站的好处是给了你一个可以随便折腾的虚拟环境命令敲错了不会把自己电脑搞坏特别适合练手。我的经验是第4天不用贪多目标定小一点理解标准输入输出、会用管道串命令、能把grep用明白、再初步认识sed和awk就够了。贪多嚼不烂尤其文本处理命令每一项单独拿出来都够研究很久。2. 核心命令实操每天都会用到的细节与速查2.1 重定向、、2和21重定向本质上就是改变数据的流向。Linux里每个进程默认有三个流标准输入stdin编号0、标准输出stdout编号1、标准错误stderr编号2。平时你敲命令看到的内容大多来自标准输出而报错信息走的是标准错误。默认情况下两个都显示在终端但重定向可以让你把它们分别导到文件里。举个例子ls filelist.txt会把ls的结果写到filelist.txt里屏幕上什么都不显示。如果filelist.txt之前已经有内容这个命令会直接覆盖它想要追加就用ls filelist.txt。这两个符号的区别我一开始老记混后来给自己编了一句口诀“单箭头是覆盖双箭头是追加。”真正容易踩坑的是错误重定向。比如你想把ls /nonexist的报错信息存到文件里直接ls /nonexist out.txt会发现out.txt是空的因为报错走的是标准错误而只重定向了标准输出。这时候要写2ls /nonexist 2 error.txt。如果想把标准输出和标准错误都放进同一个文件可以用21意思是“把标准错误也指向标准输出当前的去向”。注意21的顺序不能乱写。command file 21的意思是先把标准输出定向到文件再把标准错误指向标准输出的位置这样两者都进文件。如果写成command 21 file标准错误会先被指向屏幕结果错误信息仍然只出现在终端上。这个顺序问题我踩过好几次现在每次写都会下意识检查一遍。第4天练重定向的时候我还发现一个小技巧用/dev/null这个“黑洞设备”来丢弃不需要的信息。比如编译程序时会刷出大量提示make /dev/null 21就可以让屏幕保持干净只看有没有错误。2.2 管道符|与xargs的区别管道可以说是Shell最有魅力的设计之一。符号是竖线|作用是把左边命令的标准输出接到右边命令的标准输入。举个最简单的例子ls | wc -lls列出当前目录所有文件wc -l数行数组合起来就统计了文件数量。这就是两条命令协同工作了。管道能串多长理论上你可以一直串下去。比如我要查当前系统里有没有nginx进程ps aux | grep nginx | grep -v grepps aux列出所有进程grep nginx过滤出包含nginx的行grep -v grep再把刚才那条grep命令自身产生的进程信息过滤掉。这个组合在服务器上查服务状态时非常常用说白了就是一个临时的小型“进程管理器”。刚开始学的时候我会把管道理解成“命令的水管接头”左边出水右边接水。但有一个细节需要注意并不是所有命令都接受从标准输入传过来的数据。比如ls、rm这类命令它们更习惯接收参数而不是从标准输入读内容。这时候就需要xargs出马它能把前面命令的输出转换成后面命令的参数。find . -name *.log | xargs rm这条命令会找出当前目录下所有.log文件然后交给rm去删除。如果文件名里有空格直接这么写可能会出问题——空格会被误认为是参数分隔符。稳妥的办法是加-0或者-d \n让xargs按换行符而不是空格来分割。这个坑在处理文件名比较怪异的场景时特别常见提前了解可以省不少事。2.3 grep日志检索的第一选择grep可能是文本处理命令里我最先尝到甜头的一个。全称是“global regular expression print”意思是在文件中全局搜索匹配正则表达式的行并打印出来。它的基本用法很简单grep 关键词 文件名比如grep error system.log就会把所有包含error的行显示在终端上。只记基本用法肯定不够我把第4天整理的高频参数列一下参数作用实例-i忽略大小写grep -i error system.log-n显示匹配行行号grep -n error system.log-v反向匹配取不包含关键词的行grep -v debug system.log-r递归搜索目录下所有文件grep -r TODO /home/project-c统计匹配行数量grep -c error system.log-E使用扩展正则表达式grep -E error真正让我觉得grep强大的是它能够匹配正则表达式。虽然第4天我不可能把正则全学会但基础那几个已经足够^匹配行首$匹配行尾.匹配任意单个字符*表示前面的字符出现任意次。比如grep ^2024- access.log就能把访问日志里2024年开头的行全部抓出来。在查日志的时候我通常会把grep和tail组合起来用。tail -f可以实时跟踪日志文件的更新但如果只想看里面的错误信息屏幕会刷得很快。tail -f app.log | grep ERROR就能把错误信息实时过滤出来。不过有个细节管道会让输出变慢如果想保持实时性可以给grep加--line-buffered参数让它每读到一行就立即输出而不是攒一批再输出。2.4 sed流式文本编辑的入门玩法sed全称“stream editor”按行读取文本做处理后再输出最常用的场景是替换、删除和打印指定行。第4天我只用了它的三个基本功足够应付大部分日常需求。打印指定区间行sed -n 10,20p /etc/passwd这条命令只打印/etc/passwd的第10到20行。-n参数的意思是“不要默认输出所有行”起作用的是结尾的pprint。不加-n的话sed会先把文件内容原样打印一遍再把匹配的行重复打印一遍屏幕会乱成一锅粥。删除行sed 1,5d access.log删除第1到5行后输出注意原始文件不会变。d就是delete。替换文本sed s/old/new/g config.confs表示替换old是被替换的内容new是新内容g表示替换该行所有匹配而不是只替换第一处。这条命令同样只把替换结果输出到屏幕不会改原文件。真正要小心的是-i参数。sed -i s/old/new/g config.conf会直接修改原文件没有回退机会。我第4天练的时候就在测试文件上试过结果替换完才发现写错了规则文件内容已经变了。后来养成的习惯是先不加-i把输出结果看一遍确认无误再带上-i执行或者提前备份一份。2.5 awk处理“列”的利器awk跟sed定位不太一样sed擅长按行做整体操作awk则擅长按列去分析和统计。它默认用空白字符空格、Tab把每一行拆成多列$1表示第一列$2表示第二列$0表示整行。比如我想看/etc/passwd里所有用户名这个文件每行用冒号分隔多个字段用户名在第一列awk -F: {print $1} /etc/passwd-F:的意思就是“使用冒号作为分隔符”。没有这个参数awk一看行里没有空格会把整行当成一列那$1就是整行了完全不是想要的效果。awk更实用的一点是可以在处理时做判断和统计。比如我有一个访问日志每行包含“IP 时间 状态”想统计总访问次数awk {count} END {print count} access.log这里的count是一个变量每处理一行就自增一次处理完所有行后进入END块打印最终数值。如果想统计某个IP出现了多少次可以写成awk $1192.168.1.1 {count} END {print count} access.log这个能力放到第4天学有点超纲但并不会卡住太久因为语法非常直观。我的建议是awk不用一次吃透先记住“-F指定分隔符、$1取第几列、END在执行完所有行之后做收尾”这三点剩下的等碰到具体问题再查慢慢就会了。2.6 我整理的Linux命令速查表第4天版学完这些之后我把自己已经遇到的命令整理成一张速查表。在Linux学习第4天这个节点与其背一堆暂时用不上的命令不如先把手边高频的整理清楚。这张表我到现在还在用每次忘了参数就回来翻一眼分类命令常用场景文件操作ls -l、cp -r、mv、rm -rf查看、复制、移动、删除目录操作cd、pwd、mkdir -p切换、显示、创建目录权限chmod、chown改权限、改属主输出、、2、21重定向输出与错误管道|、xargs串命令、传参文本检索grep、grep -E过滤关键词、正则匹配文本编辑sed -n、sed -i打印指定行、批量替换列处理awk -F、print $N指定分隔符、取列统计wc -l、sort、uniq -c行数统计、排序、去重计数进程ps aux、kill查看进程、结束进程在平台刷题的时候我会把这份速查表放在手边。碰到一道题先想它考的是哪个分类再想具体用哪条命令实在想不起来再去查。这个过程比直接看答案有效得多。3. 实操过程与踩坑实录以“头歌”风格的练手题为样本3.1 模拟实训题1统计日志中访问次数最多的IP这个题目很像我在平台上做过的练习有一个access.log文件每行格式大概是“192.168.1.1 - - [时间] “GET /index.html HTTP/1.1” 200 1024”日志文件可能有几万行要求统计出访问次数最多的前3个IP。乍一看毫无头绪但拆解之后每一步都不难。第一步用awk取出每行的第一列也就是IP地址第二步用sort排序让相同的IP挨在一起第三步用uniq -c统计每个IP出现的次数第四步再用sort -nr按出现次数从大到小排序第五步用head -3取出前3名。整条命令长这样awk {print $1} access.log | sort | uniq -c | sort -nr | head -3这条组合命令里的关键点在“为什么先sort再uniq”。uniq的工作原理是只把相邻且相同的行合并统计。如果IP是按时间乱序排列的同一个IP分散在各行直接uniq -c会把同一个IP统计好几遍。先sort让相同IP聚在一起再uniq才能统计准确。这个逻辑我第4天一开始没想通在测试文件上跑完发现数字明显不对才反应过来问题出在这。实操心得组合命令写完不要急着看最终结果先把它拆成一段一段单独执行。比如先跑awk {print $1} access.log | head再看sort | uniq -c | head每一段输出对不对一目了然。这样排查问题的速度比整体盯着命令发呆快得多。3.2 模拟实训题2提取用户名列表并按字母排序这个题是让从/etc/passwd里把所有用户名提取出来按字母顺序排列并去掉重复项。先说答案awk -F: {print $1} /etc/passwd | sort -usort -u会排序并去重比sort | uniq更简洁。第一次做这题时我把-F:漏掉了结果awk把整行当作一个字段输出的不是用户名而是整行内容。这就是分隔符的重要性——对着一堆用冒号分隔的文本你必须明确告诉awk“以什么作为拆分依据”。有时候题目会再加一个要求统计总共有多少个不同的用户名。这时候接着用管道awk -F: {print $1} /etc/passwd | sort -u | wc -lwc -l统计行数就是不同用户名的个数。这道题练完我对“管道里每一步只做一件事、多件事就多串几段”这个思路有了更深的理解。3.3 模拟实训题3批量修改配置文件中的端口号这道题更接近真实工作场景项目里有几十个配置文件里面的端口号写的是8080需要统一改成9090。用编辑器一个个改显然不现实sed可以一次搞定find /home/project/config -name *.conf -exec sed -i s/8080/9090/g {} \;这里find负责找出所有.conf文件-exec对每个文件执行后面的sed替换命令。{}是find找到的文件名占位符\;表示命令结束。这个写法可以记下来以后做批量配置修改、批量文本替换都会用到。我第4天在这道题上犯过一个低级的错误忘记先做个备份就直接加-i执行了结果有一行替换规则写错把“8080端口”误替换成了“9090端口”之后文件内容完全变了。后来我学乖了批量操作前先用cp config config.bak整体备份一份或者先用不带-i的sed预览输出确认无误再做实际修改。3.4 常见问题与排查技巧实录这几天的实践里我遇到不少让新手抓狂的状况。这里挑几个典型的列出来直接做成速查表以后遇到可以对号入座症状可能原因排查/解决办法敲了命令后终端卡住没有提示符漏了命令末尾的引号或管道Shell还在等待输入按CtrlC取消当前输入重新检查命令是否完整 file执行后文件内容为空命令本来没有标准输出或者把输出写到了2那个通道先不带重定向执行看屏幕是否有显示grep在日志里查不到关键词关键词大小写不匹配或日志用了压缩格式加-i忽略大小写压缩文件先用zgrepsed -i执行后文件内容不对替换表达式写错先用不带-i的sed看输出再实际修改find . -name *.log | rm报错无法删除rm不直接从标准输入读取文件名改用find . -name *.log -delete或加xargsps aux | grep mysql出现两条记录一条是mysql进程另一条是grep自身进程加grep -v grep过滤掉grep行排错有一条通用原则把复杂命令拆开一段一段看输出。比如管道串了五条命令结果不对就从前往后逐步加段看到底是哪一段出了问题。这个方法我后面每次排查脚本问题都在用效率远比盯着整条命令冥思苦想高。4. 学完第4天的经验总结与后续建议4.1 我总结的三个心得原则第一个原则拿到需求先想“要处理什么数据、用什么工具”。文本检索想到grep按列处理想awk按行改内容想sed目录里批量操作想find加xargs。这个对应关系建立起来之后很多命令组合自然而然就出来了。第二个原则命令是积木先组合再优化。别想着一步到位写出最精简的命令先把功能跑通再考虑用更少数量的命令、更短的表达式替代。比如我第一次统计IP就是先awk一下看看结果对不对再串sort和uniq最后才合并成一行。先求正确再求效率这个顺序不会错。第三个原则除非天天用否则不用硬背参数。Linux命令的参数非常多靠“man命令”和“--help”完全够用。我整理“lunix命令大全”的时候发现真正常用的参数不到常用命令参数的20%先把这20%用熟剩下的遇到再查就行。4.2 后面还能往哪些方向扩展第4天学完建议接下来趁热打铁接触几个“近亲”命令find的高级用法按时间、大小筛选、sort的时间排序、cut按列切分、tr字符替换这些和第4天学的命令经常一起出现。再往后就可以尝试把一组组合命令写成shell脚本存成.sh文件实现“一次编写、反复执行”。如果你是用实训平台学习我的建议是把每天练过的习题按“需求描述我的命令结果截图”的方式记录下来。我在平台刷题时会建一个专门笔记按日期记录每道题的思路和踩坑回看时发现很多题就是反复考同样的模式取列用awk、过滤用grep、统计去重用sort和uniq、改文本用sed。把这些模式练熟比盲目刷几十道题更有效。4.3 给同样在学Linux的朋友一点建议第4天是个分水岭。前3天学的是“单兵作战”的命令第4天开始进入“团队协作”。可能你也会像我当时一样被21、xargs这些概念搞得有点晕甚至想放弃。我的切身体会是不用急这些概念第一次接触一定会卡卡住就停下来拆开慢慢理解跑通一个小例子就记住了。到了第4天晚上我重新打开自己的Linux学习笔记把这一天学的每个命令都自己编一个小任务验证一遍比如“把当前目录文件名列表写入文件”“统计日志中ERROR出现次数”“把配置里的8080替换成9090”。这些任务都很小但全部独立完成之后心里那种“好像摸到点门道”的踏实感是前三天没有的。如果让我给今天的内容留一句话那就是不要只背命令要背“套路”。IP统计用awksortuniqsort错误查询用tailgrep批量替换用findsed。这些套路才是第4天真正学到的东西。而有了这些套路之后下一步学shell脚本、写自动化任务都会顺很多。
返回列表