0Pricing
DevOps Bootcamp · 课时

高级文本处理(sed、awk)

探索用于流编辑的“sed”,以及用于强大文本处理、模式扫描和数据提取的“awk”。

高级文本处理(sed、awk) 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。

使用 sed 编辑数据流

sed 是“流编辑器”的简称,是一种功能强大的命令行工具,用于解析和转换文本。它会逐行处理文本数据流。您可以将它看作一种非交互式文本编辑器。

sed 读取一行,应用一条命令(例如替换或删除),打印结果,然后处理下一行。这使它非常适合处理大型文件或通过管道传输的数据。

简单的文本替换

sed 最常见的用途是替换文本。我们使用 s 命令,后跟一个分隔符(通常是 /)、要查找的模式、另一个分隔符、替换文本和最后一个分隔符。

语法:sed 's/pattern/replacement/' filename

请尝试在示例文件中将“apple”替换为“orange”:

#!/bin/bash
# Create a sample file
echo "I like red apple." > fruits.txt
echo "My favorite fruit is apple." >> fruits.txt
echo "Another apple here." >> fruits.txt

echo "Original content:"
cat fruits.txt
echo ""

echo "---"
echo "Running sed command:"
sed 's/apple/orange/' fruits.txt
# Clean up
rm fruits.txt

全局匹配与忽略大小写

默认情况下,sed 只会替换每行中模式的第一个匹配项。要替换一行中的所有匹配项,请使用 g(全局)标志。

要执行不区分大小写的搜索,请使用 i 标志。您可以组合使用多个标志,例如 gi。

示例:将所有不区分大小写的 "apple" 替换为 "banana"。

#!/bin/bash
# Create a sample file
echo "Apple is good." > fruits.txt
echo "I eat an apple and another Apple." >> fruits.txt
echo "Apples are tasty." >> fruits.txt

echo "Original content:"
cat fruits.txt
echo ""

echo "---"
echo "Running sed command (s/apple/banana/gi):"
sed 's/apple/banana/gi' fruits.txt
# Clean up
rm fruits.txt

使用 sed 删除行

您还可以使用 sed 删除与特定模式匹配的整行。为此需要使用 d 命令。

语法:sed '/pattern/d' filename

这对于删除不需要的行很有用,例如包含 "DEBUG" 的日志记录或空行。

下面删除包含 "error" 的行:

#!/bin/bash
# Create a sample file
echo "INFO: User logged in." > log.txt
echo "WARNING: Disk space low." >> log.txt
echo "ERROR: File not found." >> log.txt
echo "INFO: Operation complete." >> log.txt
echo "ERROR: Permission denied." >> log.txt

echo "Original content:"
cat log.txt
echo ""

echo "---"
echo "Running sed command (/error/d):"
sed '/error/d' log.txt
# Clean up
rm log.txt

awk:模式扫描语言

awk 是另一个功能强大的文本处理工具,常用于数据提取和生成报告。sed 是流编辑器,而 awk 更像是一种专为处理文本而设计的编程语言。

awk 会像 sed 一样逐行处理文本文件。不过,它会将每行视为一条“记录”,并根据分隔符将记录拆分为多个“字段”(列)。

默认情况下,awk 使用空白字符(空格、制表符)作为字段分隔符。

访问数据字段

在 awk 中,字段分别表示为 $1、$2、$3 等。$0 表示整行内容。

您可以在花括号 {} 中使用 print 命令打印特定字段。语法为:awk '{ print $FIELD_NUMBER }' filename

下面从一个简单的数据文件中打印第一个和第三个字段:

#!/bin/bash
# Create a sample file
echo "Name Age City" > data.txt
echo "Alice 30 NewYork" >> data.txt
echo "Bob 24 London" >> data.txt
echo "Charlie 35 Paris" >> data.txt

echo "Original content:"
cat data.txt
echo ""

echo "---"
echo "Running awk command (print $1, $3):"
awk '{print $1, $3}' data.txt
# Clean up
rm data.txt

使用 awk 过滤行

与 sed 一样,awk 也可以根据模式过滤行。您需要在操作代码块前指定模式。只有匹配该模式的行才会执行相应操作。

语法:awk '/pattern/ { action }' filename

下面查找并只打印来自 "London" 的人员姓名:

#!/bin/bash
# Create a sample file
echo "Name Age City" > data.txt
echo "Alice 30 NewYork" >> data.txt
echo "Bob 24 London" >> data.txt
echo "Charlie 35 Paris" >> data.txt
echo "David 28 London" >> data.txt

echo "Original content:"
cat data.txt
echo ""

echo "---"
echo "Running awk command (/London/ {print $1}):"
awk '/London/ {print $1}' data.txt
# Clean up
rm data.txt

使用 awk 初始化与结束处理

使用 awk 时,您可以指定在处理任何行之前执行的操作(BEGIN 代码块),以及在处理完所有行之后执行的操作(END 代码块)。

BEGIN 代码块非常适合打印标题或初始化变量。END 代码块则适合打印摘要、总计或页脚。

下面为输出添加标题和页脚:

#!/bin/bash
# Create a sample file
echo "Alice 30 NewYork" > data.txt
echo "Bob 24 London" >> data.txt
echo "Charlie 35 Paris" >> data.txt

echo "Original content:"
cat data.txt
echo ""

echo "---"
echo "Running awk command (BEGIN/END):"
awk 'BEGIN { print "--- User Data ---" } { print $1, $2 } END { print "--- End Report ---" }' data.txt
# Clean up
rm data.txt

awk 中的条件逻辑

您可以在 awk 的操作代码块中使用 if 语句,根据字段值或其他条件应用逻辑。这使得 awk 非常适合复杂的数据过滤和转换。

语法:awk '{ if (condition) { action } }' filename

下面只打印年龄大于 25 岁的用户:

#!/bin/bash
# Create a sample file
echo "Alice 30 NewYork" > data.txt
echo "Bob 24 London" >> data.txt
echo "Charlie 35 Paris" >> data.txt
echo "Diana 27 Berlin" >> data.txt

echo "Original content:"
cat data.txt
echo ""

echo "---"
echo "Running awk command (if $2 > 25):"
awk '{ if ($2 > 25) { print $1, $2 } }' data.txt
# Clean up
rm data.txt

快速检查:sed 与 awk

考虑名为 names.txt 的文件中包含以下内容:

John Doe,30,New York
Jane Smith,25,London
Peter Jones,40,Paris

以下哪个命令会只输出年龄大于 30 岁人员的姓名(第一个字段)?

回顾:sed 与 awk 的强大功能

现在,您已经了解了 sed 的流编辑功能,以及 awk 的高级文本处理功能!

  • sed 非常适合逐行执行简单的替换、删除和转换。
  • awk 擅长解析结构化文本、处理字段,并应用条件逻辑来进行数据提取和生成报告。

在 Linux 环境中,这些工具对于编写脚本、分析日志和处理数据不可或缺。

常见问题解答

「高级文本处理(sed、awk)」课时是免费的吗?

是的 — 「高级文本处理(sed、awk)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。

「高级文本处理(sed、awk)」这节课中我会学到什么?

探索用于流编辑的“sed”,以及用于强大文本处理、模式扫描和数据提取的“awk”。 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 DevOps Bootcamp 需要有经验吗?

无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「高级文本处理(sed、awk)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 DevOps Bootcamp 课中编写并运行代码吗?

能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 高级文本处理(sed、awk)
  2. 归档与压缩(tar、gzip、unzip)
  3. 磁盘使用情况与系统信息(df、du、uname)
  4. 数据排序与去重(sort、uniq、cut)
← 返回 DevOps Bootcamp