Linux-awk与sed

文章目录

  • 一、AWK
    • 1. `awk` 是什么?
    • 2. `awk` 的基础语法
      • 2.1 选项
      • 2.2 模式
      • 2.3 动作
    • 3. `awk` 的内置变量
    • 4. 典型应用场景及示例
      • 4.1 打印特定列
      • 4.2 条件筛选
      • 4.3 使用正则表达式
      • 4.4 统计行数
      • 4.5 字段操作
      • 4.6 使用内置函数
      • 4.7 多文件处理
      • 4.8 使用自定义变量
    • 5. 高级应用:多行处理
    • 6. 实战案例:日志分析
      • 6.1 提取 IP 地址
      • 6.2 提取状态码
      • 6.3 统计每个 IP 的访问次数
    • 7.begin和end模式
      • 7.1`BEGIN` 模式
        • 示例 1:初始化变量
        • 示例 2:设置输入字段分隔符
      • 7.2`END` 模式
        • 示例 1:打印总结信息
        • 示例 2:统计文件行数
      • 7.3 综合示例
  • 二、SED
    • 1. `sed` 是什么?
    • 2. `sed` 的基础语法
      • 2.1 选项
      • 2.2 命令
    • 3. 常用命令及示例
      • 3.1 替换(`s`)
        • 示例 1:替换文本中的单词
        • 示例 2:全局替换(`g` 标志)
        • 示例 3:替换第 2 行的内容
        • 示例 4:替换匹配正则表达式的行
      • 3.2 删除(`d`)
        • 示例 1:删除第 5 行
        • 示例 2:删除第 5 到第 10 行
        • 示例 3:删除所有包含 `error` 的行
      • 3.3 打印(`p`)
        • 示例 1:打印第 5 行
        • 示例 2:打印第 5 到第 10 行
        • 示例 3:打印所有包含 `error` 的行
      • 3.4 追加(`a`)和插入(`i`)
        • 示例 1:在第 5 行后追加文本
        • 示例 2:在第 5 行前插入文本
      • 3.5 替换整行(`c`)
        • 示例 1:将第 5 行替换为新内容
    • 4. 高级应用
      • 4.1 多命令组合
        • 示例:先替换,再删除
      • 4.2 直接修改文件(`-i`)
        • 示例:直接替换文件中的内容
      • 4.3 使用扩展正则表达式(`-r` 或 `-E`)
        • 示例:匹配单词边界
    • 5. 实战案例:日志处理
      • 5.1 删除所有包含 `error` 的行
      • 5.2 替换状态码 `200` 为 `OK`
      • 5.3 在每行末尾追加注释
  • 参考文档


一、AWK

1. awk 是什么?

awk 是一种强大的文本处理工具,主要用于处理结构化的文本数据(如表格、日志文件等)。它能够逐行读取文件内容,根据指定的规则对每一行进行处理,并输出结果。awk 的名字来源于其发明者的姓氏首字母(Aho、Weinberger、Kernighan)。


2. awk 的基础语法

awk 的基本语法如下:

awk [选项] '模式 {动作}' 文件

2.1 选项

  • -F fs:指定输入字段分隔符(默认是空格或制表符)。
  • -v var=value:向 awk 脚本传递变量。
  • -f script.awk:从文件读取 awk 脚本。

2.2 模式

模式用于指定哪些行需要执行动作。可以是:

  • 空模式({}):匹配所有行。
  • 正则表达式(/pattern/):匹配符合正则表达式的行。
  • 条件表达式($1 > 100):匹配满足条件的行。

2.3 动作

动作是用 {} 包裹的代码块,用于对匹配的行进行处理。可以使用 awk 的内置函数和变量。


3. awk 的内置变量

awk 提供了许多内置变量,用于处理文本数据:

变量作用
$0当前行的全部内容
$1, $2, ...当前行的第 1、第 2、… 个字段
NF当前行的字段数
NR当前行号(全局)
FNR当前文件的行号
FS输入字段分隔符(默认是空格或制表符)
OFS输出字段分隔符(默认是空格)
RS输入记录分隔符(默认是换行符)
ORS输出记录分隔符(默认是换行符)

4. 典型应用场景及示例

4.1 打印特定列

需求:打印 /etc/passwd 文件的第 1 列和第 7 列(字段分隔符是冒号 :)。

awk -F: '{print $1, $7}' /etc/passwd

4.2 条件筛选

需求:筛选出第 2 列大于 100 的行。

awk '$2 > 100' data.txt

4.3 使用正则表达式

需求:筛选出包含单词 error 的行。

awk '/error/' access.log

4.4 统计行数

需求:统计文件的行数。

awk 'END {print NR}' file.txt

4.5 字段操作

需求:将第 1 列和第 2 列拼接成新的字段,用逗号分隔。

awk -F: '{print $1 "," $2}' /etc/passwd

4.6 使用内置函数

需求:计算每行的字段数。

awk '{print NF}' data.txt

4.7 多文件处理

需求:同时处理多个文件,打印每个文件的行号和内容。

awk '{print FNR, $0}' file1.txt file2.txt

4.8 使用自定义变量

需求:计算所有行的第 3 列的总和。

awk '{sum += $3} END {print sum}' data.txt

5. 高级应用:多行处理

需求:打印每行的前 3 行内容。

awk '{print NR-3, NR-2, NR-1, NR, $0}' data.txt

6. 实战案例:日志分析

假设有一个日志文件 access.log,格式如下:

192.168.1.1 - - [25/Jul/2024:10:42:35 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [25/Jul/2024:10:42:36 +0800] "POST /submit HTTP/1.1" 200 5678

6.1 提取 IP 地址

awk '{print $1}' access.log

6.2 提取状态码

awk '{print $9}' access.log

6.3 统计每个 IP 的访问次数

awk '{ip[$1]++} END {for (i in ip) print i, ip[i]}' access.log

7.begin和end模式

awk 中,BEGINEND 是两个特殊的模式。

  • BEGIN:在处理任何输入行之前执行一次,适合初始化变量、设置输入字段分隔符等。
  • END:在处理完所有输入行之后执行一次,适合打印总结信息、执行后续操作等。

7.1BEGIN 模式

BEGIN 模式在处理任何输入行之前执行一次。它通常用于:

  • 初始化变量。
  • 设置输入字段分隔符(FS)。
  • 执行一些在处理文件之前需要完成的操作。
示例 1:初始化变量

假设我们要计算文件中所有数字的总和,可以在 BEGIN 中初始化总和变量。

awk 'BEGIN {sum = 0}{sum += $1}END {print "总和是: " sum}' data.txt
示例 2:设置输入字段分隔符

假设文件的字段分隔符是逗号(,),可以在 BEGIN 中设置 FS

awk 'BEGIN {FS=","}{print $1, $2}' data.csv

7.2END 模式

END 模式在处理完所有输入行之后执行一次。它通常用于:

  • 打印总结信息。
  • 执行一些在处理文件之后需要完成的操作。
示例 1:打印总结信息

假设我们要计算文件中所有数字的总和,并在处理完所有行后打印总和。

awk 'BEGIN {sum = 0}{sum += $1}END {print "总和是: " sum}' data.txt
示例 2:统计文件行数

假设我们要统计文件的行数。

awk 'END {print NR}' file.txt

7.3 综合示例

假设我们有一个日志文件 access.log,格式如下:

192.168.1.1 - - [25/Jul/2024:10:42:35 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [25/Jul/2024:10:42:36 +0800] "POST /submit HTTP/1.1" 200 5678

需求:统计每个状态码的出现次数,并在处理完所有行后打印总结信息。

awk 'BEGIN {FS=" "}{status_code = $9if (status_code in status_count) {status_count[status_code]++} else {status_count[status_code] = 1}}END {for (code in status_count) {print "状态码 " code " 出现了 " status_count[code] " 次"}}' access.log

建议

  • 初始化变量:在 BEGIN 中初始化变量,避免在动作块中重复初始化。
  • 总结信息:在 END 中打印总结信息,避免在动作块中重复计算。
  • 调试:在 BEGINEND 中打印调试信息,帮助定位问题。

二、SED

1. sed 是什么?

sed(Stream Editor)是一种流编辑器,主要用于对文本数据进行处理。它逐行读取输入(可以是文件或标准输入),对每一行执行指定的编辑操作,并输出结果。sed 的操作是基于正则表达式的,非常适合进行文本替换、删除、插入等操作。


2. sed 的基础语法

sed 的基本语法如下:

sed [选项] '命令' 文件

2.1 选项

  • -i:直接修改文件内容(慎用,会覆盖原文件)。
  • -e:允许使用多条命令。
  • -f:从文件读取命令。
  • -r-E:使用扩展正则表达式(更强大的正则表达式支持)。
  • -n:静默模式,不自动打印每一行,需要显式使用 p 命令打印。

2.2 命令

sed 的命令格式为:

[地址]命令
  • 地址:可以是行号(如 5)、范围(如 5,10)、正则表达式(如 /pattern/)等。
  • 命令:常见的命令有 s(替换)、d(删除)、p(打印)、a(追加)、i(插入)等。

3. 常用命令及示例

3.1 替换(s

sed 最常用的命令是 s,用于替换文本中的内容。

示例 1:替换文本中的单词

需求:将文件中的所有 foo 替换为 bar

sed 's/foo/bar/' file.txt
示例 2:全局替换(g 标志)

需求:将文件中的所有 foo 替换为 bar(每行替换所有出现的 foo)。

sed 's/foo/bar/g' file.txt
示例 3:替换第 2 行的内容

需求:只替换第 2 行中的 foobar

sed '2s/foo/bar/' file.txt
示例 4:替换匹配正则表达式的行

需求:只替换包含 error 的行中的 foobar

sed '/error/s/foo/bar/' file.txt

3.2 删除(d

删除指定的行。

示例 1:删除第 5 行
sed '5d' file.txt
示例 2:删除第 5 到第 10 行
sed '5,10d' file.txt
示例 3:删除所有包含 error 的行
sed '/error/d' file.txt

3.3 打印(p

打印指定的行(通常与 -n 选项一起使用)。

示例 1:打印第 5 行
sed -n '5p' file.txt
示例 2:打印第 5 到第 10 行
sed -n '5,10p' file.txt
示例 3:打印所有包含 error 的行
sed -n '/error/p' file.txt

3.4 追加(a)和插入(i

在指定位置追加或插入文本。

示例 1:在第 5 行后追加文本
sed '5a ===' file.txt
示例 2:在第 5 行前插入文本
sed '5i ===' file.txt

3.5 替换整行(c

将指定行替换为新内容。

示例 1:将第 5 行替换为新内容
sed '5c new line' file.txt

4. 高级应用

4.1 多命令组合

可以使用 -e 选项组合多个命令。

示例:先替换,再删除
sed -e 's/foo/bar/' -e '5d' file.txt

4.2 直接修改文件(-i

直接修改文件内容(慎用,会覆盖原文件)。

示例:直接替换文件中的内容
sed -i 's/foo/bar/' file.txt

4.3 使用扩展正则表达式(-r-E

使用更强大的正则表达式。

示例:匹配单词边界
sed -r 's/\bfoo\b/bar/' file.txt

5. 实战案例:日志处理

假设有一个日志文件 access.log,格式如下:

192.168.1.1 - - [25/Jul/2024:10:42:35 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [25/Jul/2024:10:42:36 +0800] "POST /submit HTTP/1.1" 200 5678

5.1 删除所有包含 error 的行

sed '/error/d' access.log

5.2 替换状态码 200OK

sed 's/200/OK/' access.log

5.3 在每行末尾追加注释

sed 's/$/ # processed/' access.log

参考文档

  1. 官方文档:GNU Sed Manual
  2. 在线教程:Sed One-Liners Explained
  3. 官方文档:GNU Awk User’s Guide
  4. 在线教程:Learn Awk the Hard Way

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93576.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件加密工具(勒索病毒加密方式)

语言:C# WPF功能:文件加/解密本程序不提供下载,该程序新手操作不当,可能会导致文件加密后无法解密问题,解密需要独立私钥private.key文件支持,没有私钥加密文件是无法被解密的。更新:2025年7月3…

IOC实现原理源码解析

Spring三级缓存流程图singletonObjects(一级缓存):缓存经过了完整生命周期的Bean;arlySingletonobjects(二级缓存):缓存未经过完整生命周期的Bean,如果某个Bean出现了循环依赖&#…

笔记本电脑磁盘维护指南:WIN11系统磁盘维护完全手册

1. 引言 在当今数字化时代,笔记本电脑已经成为我们工作、学习和娱乐不可或缺的重要工具。随着Windows 11操作系统的普及和应用,用户对于系统性能和稳定性的要求越来越高。然而,许多用户往往忽视了一个至关重要的方面——磁盘维护。磁盘作为计算机系统中负责数据存储和读取的…

李宏毅2025《机器学习》-第九讲:大型语言模型评测的困境与“古德哈特定律”**

摘要: 随着大型语言模型(LLM)的推理能力日益增强,如何公平、准确地评测其“智力”水平,成了一个极其棘手的问题。本文基于李宏毅教授的最新课程,深入探讨了当前LLM评测面临的困境。文章首先揭示了标准数学和…

Spring Boot集成Chaos Monkey:构建高韧性系统的故障注入实战指南

Spring Boot集成Chaos Monkey:构建高韧性系统的故障注入实战指南一、Chaos Engineering核心原理1.1 混沌工程价值矩阵1.2 Chaos Monkey核心攻击类型二、Spring Boot集成Chaos Monkey2.1 基础集成配置依赖引入配置文件 - application.yml2.2 高级攻击策略配置自定义攻…

AtCoder Beginner Contest 416(ABCDE)

A - Vacation Validation 翻译&#xff1a; 给你一个长度为 N 的字符串 S&#xff0c;它由 o 和 x 以及整数 L 和 R 组成。 请判断 S 中从第 L 个字符到第 R 个字符的所有字符是否都是 o。 思路&#xff1a; &#xff08;模拟&#xff09; 实现&#xff1a; #include<bits…

【AlphaFold3】网络架构篇(2)|Input Embedding 对输入进行特征嵌入

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a;【AlphaFold3】网络架构篇&#xff08;1&#xff09;|概览预测算法每日一言&#x1f33c;: 去留无意&#xff0c;闲看庭前花开花落&#xff1b…

秋招Day20 - 微服务 - 概念

什么是微服务&#xff1f;将一个大型的单体项目分割成一个个可以独立开发和部署的小服务&#xff0c;服务之间松耦合&#xff0c;可以通过轻量级通信机制&#xff08;比如HTTP&#xff09;相互协作微服务带来了哪些挑战&#xff1f; 介绍一下一下Dubbo&#xff1f;Dubbo是一个高…

PyTorch 生态四件套:从图片、视频到文本、语音的“开箱即用”实践笔记

写在前面 当我们谈论 PyTorch 时&#xff0c;我们首先想到的是 torch.Tensor、nn.Module 和强大的自动求导系统。但 PyTorch 的力量远不止于此。为了让开发者能更高效地处理图像、文本、音频、视频等真实世界的复杂数据&#xff0c;PyTorch 建立了一个强大的官方生态系统。本文…

2023 年 NOI 最后一题题解

问题描述2023 年 NOI 最后一题是一道融合图论与动态规划的综合优化问题&#xff0c;聚焦于带时间窗约束的多路径规划。题目具体要求如下&#xff1a;给定一个有向图&#xff0c;其中节点代表城市&#xff0c;边代表交通路线。每条边具有三个属性&#xff1a;行驶时间、基础费用…

Android补全计划 TextView设置文字不同字体和颜色

1 富文本 1 java中动态加载文本 颜色 String strMsg "今天<font color\"#00ff00\">天气不错</font>"; tv_msg.setText(Html.fromHtml(strMsg));字体和颜色 String str2 "今天<font color\"#00ff00\"><big>天气不…

C语言:详解单链表与例题

C语言&#xff1a;详解单链表与例题 1.单链表的实现 2.例题&#xff1a;移除链表元素 1.单链表的实现 链表根据带头或不带头、单向或双向、循环或不循环分类为8种&#xff0c;最常用的是单链表和双向链表&#xff0c;单链表是 不带头单向不循环 链表。 链表由节点组成&#xff…

从0开始学习R语言--Day62--RE插补

对于会有多次测量值的数据&#xff0c;用普通的回归去插补&#xff0c;往往会忽略掉数据个体本身的特点&#xff0c;毕竟多次的测量值其实就代表了数据个体的不稳定性&#xff0c;存在额外的干扰。而RE的插补原理是结合个体本身的随机效应和群体的固体效应再加上截距进行插补的…

RESTful API开发指南:使用Spring Boot构建企业级接口

目录 1. 引言2. RESTful API基础概念3. Spring Boot环境搭建4. 项目结构设计5. 核心组件开发6. 数据库集成7. 安全认证8. 异常处理9. API文档生成10. 测试策略11. 部署与监控12. 最佳实践 1. 引言 在现代软件开发中&#xff0c;RESTful API已成为构建分布式系统和微服务架构…

从 Print 到 Debug:用 PyCharm 掌控复杂程序的调试之道

目录摘要调试工具窗口会话工具栏调试工具栏单步工具栏调试器选项卡调用栈帧&#xff08;Frames&#xff09;变量&#xff08;Variables&#xff09;&#x1f4a1; 表达式求值区域&#xff08;Evaluate expression field&#xff09;&#x1f5b1;️ 右键菜单&#xff08;Contex…

用于前列腺活检分级的分层视觉 Transformer:迈向弥合泛化差距|文献速递-医学影像算法文献分享

Title题目Hierarchical Vision Transformers for prostate biopsy grading: Towardsbridging the generalization gap用于前列腺活检分级的分层视觉 Transformer&#xff1a;迈向弥合泛化差距01文献速递介绍前列腺癌是全球男性中第二常见的确诊癌症&#xff0c;也是第五大致命癌…

Apple基础(Xcode②-Flutter结构解析)

&#x1f3d7;️ 目录结构速查表&#xff08;your_project/ios/ 下&#xff09;ios/ ├── Runner/ ← 原生 iOS 工程根目录&#xff08;Xcode 打开它&#xff09; │ ├── AppDelegate.swift ← App 入口&#xff08;类似 Android 的 MainActivity&…

X00229-基于深度强化学习的车联网资源分配python完整

X00229-基于深度强化学习的车联网资源分配python完整

面向多模态自监督学习的共享表示与独有表示解耦

通俗说法&#xff1a;在多模态自监督学习中&#xff0c;将共享信息和独有信息分离开来 Abstract 问题&#xff1a; 传统方法通常假设在训练和推理阶段都可以访问所有模态信息&#xff0c;这在实际应用中面对模态不完整输入时会导致性能显著下降。 解决方法&#xff1a;提出了一…

【iOS】weak修饰符

前言前面我们已经学习了解了sideTable&#xff0c;今天来看看在OC中&#xff0c;sideTable是如何在我们使用weak时工作的。在OC中&#xff0c;weak修饰符是一种用于声明“弱引用”的关键字&#xff0c;其核心特性是不参与对象的引用计数管理&#xff0c;而且当被引用的对象被释…