
Linux文本处理工具与正则表达式实战指南本文基于Ubuntu 24.04 LTS系统在真实服务器上执行所有命令并捕获输出。涵盖VIM编辑器、文本处理三剑客grep/sed/awk、常用文本工具、正则表达式、文件查找与压缩打包等核心技能。系统环境Ubuntu 24.04.4 LTS (Noble Numbat) | VIM 9.1 章节导航一、VIM编辑器三种模式二、文本处理工具三、grep与正则表达式四、sed流编辑器五、find文件查找六、压缩与打包七、其他实用文本工具八、总结一、VIM编辑器三种模式VIMVi IMproved是Linux下最强大的文本编辑器之一。先来看看服务器上的版本信息$vim--version|head-5VIM - Vi IMproved9.1(2024Jan 02, compiled Jul13202617:17:48)Included patches:1-16,647,678,697Modified by teamvimtracker.debian.org Compiled by teamvimtracker.debian.org Huge version without GUI. Features included()or not(-):1.1 三种模式详解VIM有三种核心工作模式理解它们的切换是高效编辑的基础模式说明进入方式命令模式Normal默认模式用于光标移动、复制粘贴、删除等按Esc键插入模式Insert文本输入模式像普通编辑器一样打字命令模式下按i/a/o等底线命令模式Ex执行保存、退出、替换等命令命令模式下按:进入1.2 模式切换图解┌─────────────┐ i/a/o ┌─────────────┐ │ 命令模式 │ ──────────→ │ 插入模式 │ │ (Normal) │ ←────────── │ (Insert) │ └─────────────┘ Esc └─────────────┘ │ │ : (冒号) ↓ ┌─────────────┐ │ 底线命令模式 │ │ (Ex) │ └─────────────┘1.3 常用命令速查命令模式下的光标移动h/j/k/l— 左/下/上/右移动gg— 跳到文件首行G— 跳到文件末行0— 跳到行首$— 跳到行尾w/b— 向前/向后跳一个单词命令模式下的编辑操作dd— 删除剪切当前行yy— 复制当前行p— 粘贴u— 撤销Ctrlr— 恢复x— 删除光标处字符底线命令模式:w— 保存:q— 退出:wq— 保存并退出:q!— 强制退出不保存:%s/old/new/g— 全局替换实战技巧在命令模式下输入:set nu可以显示行号:set paste可以在粘贴时避免自动缩进问题这在从外部复制配置到VIM时非常实用。二、文本处理工具Linux提供了丰富的文本处理工具它们是运维人员的瑞士军刀。我们先创建一个演示文件$cat/tmp/demo.txtEOF apple 10 3.5 banana 20 2.8 apple 15 4.2 cherry 8 5.0 banana 12 3.8 date 5 6.0 apple 20 3.5 elderberry 3 8.5 cherry 10 5.0 fig 7 4.5 EOF2.1 cut — 按列提取cut命令按分隔符提取指定列在处理CSV或空格分隔的数据时非常方便$cut-d -f1/tmp/demo.txt apple banana apple cherry bananadateapple elderberry cherry fig $cut-d -f1-2 /tmp/demo.txt apple10banana20apple15cherry8banana12date5apple20elderberry3cherry10fig7-d 指定空格为分隔符-f1提取第1列-f1-2提取第1到2列2.2 sort — 排序sort支持字典序和数值排序还能指定分隔符和排序字段$sort/tmp/demo.txt apple103.5apple154.2apple203.5banana123.8banana202.8cherry105.0cherry85.0date56.0elderberry38.5fig74.5$sort-t -k2-rn/tmp/demo.txt banana202.8apple203.5apple154.2banana123.8cherry105.0apple103.5cherry85.0fig74.5date56.0elderberry38.5-t 指定分隔符为空格-k2按第2列排序-rn逆序数值排序rreverse, nnumeric2.3 uniq — 去重与统计uniq只能去除连续的重复行所以通常配合sort使用$cut-d -f1/tmp/demo.txt|sort|uniqapple banana cherrydateelderberry fig $cut-d -f1/tmp/demo.txt|sort|uniq-c3apple2banana2cherry1date1elderberry1figuniq -c统计每行出现的次数这在日志分析中极为常用——比如统计各种HTTP状态码的出现频率。2.4 tr — 字符转换tr用于字符级别的替换、删除和压缩$echohello world|tra-zA-ZHELLO WORLD $echoabc123def456|tr-d0-9abcdef $echoaaabbbccc|tr-sabcabctr a-z A-Z— 小写转大写tr -d 0-9— 删除所有数字tr -s abc— 压缩连续重复的a、b、c字符实战技巧tr经常用于处理Windows换行符CRLF→LFcat file.txt | tr -d \r file_unix.txt三、grep与正则表达式grep是Linux下最常用的文本搜索工具配合正则表达式可以实现强大的模式匹配。3.1 grep基本用法$grepapple/tmp/demo.txt apple103.5apple154.2apple203.5$grep-iapple$Apple\napple\nAPPLE\nbananaApple apple APPLE $grep-vapple/tmp/demo.txt banana202.8cherry85.0banana123.8date56.0elderberry38.5cherry105.0fig74.5$grep-nbanana/tmp/demo.txt2:banana202.85:banana123.8$grep-capple/tmp/demo.txt3选项功能-i忽略大小写-v反向匹配输出不匹配的行-n显示行号-c只输出匹配行数-r递归搜索目录-E使用扩展正则表达式-o只输出匹配的部分3.2 基础正则表达式BRE$grep^a/tmp/demo.txt apple103.5apple154.2apple203.5$grep0$/tmp/demo.txt cherry85.0date56.0cherry105.0$grep[ab]/tmp/demo.txt apple103.5banana202.8apple154.2banana123.8date56.0apple203.5elderberry38.5基础正则元字符^— 行首锚定$— 行尾锚定[abc]— 匹配a或b或c[^abc]— 匹配非a、b、c的字符.— 匹配任意单个字符*— 前一个字符出现0次或多次3.3 扩展正则表达式ERE使用grep -E或egrep启用扩展正则支持更多元字符$grep-Eapple|banana/tmp/demo.txt apple103.5banana202.8apple154.2banana123.8apple203.5$grep-E^(a|b)/tmp/demo.txt apple103.5banana202.8apple154.2banana123.8apple203.5$grep-E[0-9]{2,}/tmp/demo.txt apple103.5banana202.8apple154.2banana123.8apple203.5cherry105.0扩展正则新增元字符|— 或alternation— 前一个字符出现1次或多次?— 前一个字符出现0次或1次{n,m}— 前一个字符出现n到m次()— 分组实战技巧排查日志中的IP地址可以用grep -E ([0-9]{1,3}\.){3}[0-9]{1,3} access.log查找邮箱可以用grep -E [a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,} file.txt四、sed流编辑器sedStream Editor是强大的文本流编辑器擅长对文本进行批量替换、删除、插入等操作。4.1 替换操作$echohello world|seds/world/Linux/hello Linux $echoapple apple apple|seds/apple/fruit/gfruit fruit fruit $seds/apple/Apple//tmp/demo.txt|head-5Apple103.5banana202.8Apple154.2cherry85.0banana123.8s/old/new/— 替换每行第一个匹配s/old/new/g— 全局替换替换所有匹配s/old/new/gi— 全局替换且忽略大小写4.2 删除操作$sed/banana/d/tmp/demo.txt apple103.5apple154.2cherry85.0date56.0apple203.5elderberry38.5cherry105.0fig74.5/banana/d删除所有包含banana的行。4.3 插入与追加$echo-eline1\nline2\nline3|sed2i\INSERTED LINEline1 INSERTED LINE line2 line3 $echo-eline1\nline2\nline3|sed2a\APPENDED LINEline1 line2 APPENDED LINE line32i\TEXT— 在第2行前插入2a\TEXT— 在第2行后追加4.4 多命令执行与打印$echohello world|sed-es/hello/HELLO/-es/world/WORLD/HELLO WORLD $sed-n/apple/p/tmp/demo.txt apple103.5apple154.2apple203.5-e执行多条sed命令-n配合p只打印匹配行类似grep实战技巧批量修改配置文件时用sed -i.bak s/old/new/g config.conf-i.bak会先备份原文件再修改安全可回退。五、find文件查找find是Linux下最强大的文件查找工具支持按名称、类型、大小、时间、权限等多种条件查找。5.1 按名称和类型查找$find/tmp-name*.txt-typef2/dev/null|head-10/tmp/compress_test2.txt /tmp/demo.txt /tmp/error.txt /tmp/test_moved.txt /tmp/redirect_test.txt5.2 按时间查找$find/etc-mtime-1-typef2/dev/null|head-10/etc/shadow- /etc/passwd /etc/gshadow /etc/subuid /etc/subgid- /etc/init.d/uniagentd /etc/shadow /etc/subgid /etc/group /etc/hosts-mtime -1表示最近1天内修改的文件。-mtime 7表示7天前修改的文件。5.3 按大小查找$find/var/log-size1M-typef2/dev/null|head-10/var/log/journal/615dfb09d1ba43a2bddb9e54eb187456/system5341ec7f25ac4b7e81c7b44956b7603d-00000000000009c7-0006571bba886682.journal /var/log/journal/615dfb09d1ba43a2bddb9e54eb187456/system.journal5.4 按权限和用户查找$find/etc-perm644-name*.conf-typef2/dev/null|head-5/etc/apport/crashdb.conf /etc/host.conf /etc/apparmor/parser.conf /etc/overlayroot.conf /etc/dbus-1/system.d/com.ubuntu.SoftwareProperties.conf $find/tmp-userroot-name*.txt-typef2/dev/null|head-5/tmp/compress_test2.txt /tmp/demo.txt /tmp/error.txt /tmp/test_moved.txt /tmp/redirect_test.txt5.5 执行动作与多条件组合$find/tmp-namedemo.txt-execwc-l{}\;10/tmp/demo.txt $find/etc-name*.conf-size1k-typef2/dev/null|head-5/etc/apport/crashdb.conf /etc/apparmor/parser.conf /etc/overlayroot.conf /etc/initramfs-tools/initramfs.conf /etc/selinux/semanage.conf-exec CMD {} \;— 对找到的每个文件执行命令多个条件默认是AND关系用-o连接表示OR实战技巧批量清理7天前的日志find /var/log -name *.log -mtime 7 -exec rm -f {} \;。建议先用-print确认再执行删除。六、压缩与打包Linux下常用的压缩工具有gzip、bzip2打包工具主要是tar。6.1 gzip 压缩解压$ls-lh/tmp/compress_test.txt -rw-r--r--1root root71Oct1622:56 /tmp/compress_test.txt $gzip/tmp/compress_test.txt $ls-lh/tmp/compress_test.txt.gz -rw-r--r--1root root107Oct1622:56 /tmp/compress_test.txt.gz $ gunzip /tmp/compress_test.txt.gz $ls-lh/tmp/compress_test.txt -rw-r--r--1root root71Oct1622:56 /tmp/compress_test.txt注对于很小的文件gzip压缩后可能反而变大因为gzip头部开销这在实际中是正常现象。6.2 tar 打包压缩tar是最常用的打包工具配合不同压缩选项实现不同压缩率# 打包不压缩$tar-cvf/tmp/archive.tar /tmp/compress_test.txt /tmp/compress_test2.txt $ls-lh/tmp/archive.tar -rw-r--r--1root root 10K Oct1622:56 /tmp/archive.tar# 打包 gzip压缩$tar-czvf/tmp/archive.tar.gz /tmp/compress_test.txt /tmp/compress_test2.txt $ls-lh/tmp/archive.tar.gz -rw-r--r--1root root207Oct1622:56 /tmp/archive.tar.gz# 打包 bzip2压缩$tar-cjvf/tmp/archive.tar.bz2 /tmp/compress_test.txt /tmp/compress_test2.txt $ls-lh/tmp/archive.tar.bz2 -rw-r--r--1root root232Oct1622:56 /tmp/archive.tar.bz2选项说明-c创建新包create-x解包extract-v显示详细过程verbose-f指定文件名-z使用gzip压缩/解压-j使用bzip2压缩/解压-t查看包内容6.3 查看与解压# 查看包内容不解压$tar-tzvf/tmp/archive.tar.gz -rw-r--r-- root/root712026-10-1622:56 tmp/compress_test.txt -rw-r--r-- root/root712026-10-1622:56 tmp/compress_test2.txt# 解压到指定目录$mkdir-p/tmp/extract_test $tar-xzvf/tmp/archive.tar.gz-C/tmp/extract_test tmp/compress_test.txt tmp/compress_test2.txt $ls-l/tmp/extract_test/tmp/ total8-rw-r--r--1root root71Oct1622:56 compress_test2.txt -rw-r--r--1root root71Oct1622:56 compress_test.txt实战技巧备份网站时常用tar -czvf backup_$(date %Y%m%d).tar.gz /var/www/html/结合日期命名方便管理多个备份版本。七、其他实用文本工具7.1 wc — 统计行数/单词数/字节数$wc/tmp/demo.txt1030132/tmp/demo.txt分别表示10行、30个单词、132个字节。7.2 head/tail — 查看文件头尾$head-3/tmp/demo.txt apple103.5banana202.8apple154.2$tail-3/tmp/demo.txt elderberry38.5cherry105.0fig74.5tail -f实时追踪文件变化是查看日志的利器。7.3 diff — 文件比较$diff/tmp/file_a.txt /tmp/file_b.txt 2c2line2 ---line2_modified2c2表示第2行有变化cchange是左边文件是右边文件。7.4 paste — 合并文件$paste/tmp/p1.txt /tmp/p2.txt a1b2c37.5 tee — 双向输出$echotee test|tee/tmp/tee_test.txtteetesttee既在屏幕上显示输出又写入文件常用于管道中保存中间结果。7.6 xargs — 管道传参$echo-e/tmp/demo.txt\n/tmp/file_a.txt|xargswc-l10/tmp/demo.txt3/tmp/file_a.txt13totalxargs将前一个命令的输出作为后一个命令的参数解决部分命令不支持管道输入的问题。八、总结本文在Ubuntu 24.04 LTS真实服务器上实操演示了Linux文本处理的核心工具链工具核心功能典型场景VIM文本编辑配置文件编辑、脚本编写cut按列提取处理CSV、提取特定字段sort排序日志排序、数据整理uniq去重统计频次统计、数据去重tr字符转换大小写转换、字符删除grep模式匹配日志搜索、配置查找sed流编辑批量替换、文本修改find文件查找清理旧文件、定位配置tar打包压缩备份归档、文件传输核心要点VIM三模式切换是高效编辑的基础Esc回命令模式是肌肉记忆grep 正则表达式是文本搜索的黄金组合基础正则与扩展正则的区别在于元字符支持范围sed的-i选项可以直接修改文件配合.bak后缀可安全回退find的-exec可以对查找结果批量执行命令是自动化运维的利器tar -czvf是最常用的打包压缩组合兼顾速度和压缩率掌握这些工具你已经具备了处理Linux下绝大多数文本处理任务的能力。下一章我们将进入Shell脚本编程的世界把这些工具组合成自动化方案。