余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

强大的 sed 和 gawk 处理日志文件

xiyangw 2023-05-14 11:37 20 浏览 0 评论

Linux 中,我们经常会遇到对文件进行处理的需要,例如从大量日志文件中抽取目标信息进行分析等。这时就需要一款有力的工具,能够轻松实现文件信息的提取,修改。幸运的是 Linux 为我们提供了两个这样的工具。sed 和 gawk 几乎可以满足我们日常工作中99%以上的日志处理要求。

sed 编辑器 (stream editor)

强大的 sed 和 gawk 处理日志文件

从名字看出,sed 是针对文件流做处理的命令。它有如下特点:

  • 一次从输入中读取一行数据
  • 根据所提供的编辑器命令匹配数据
  • 按照命令修改流中的数据
  • 将新的数据输出到STDOUT
sed [-hnV][-e<script>][-f<script文件>][文本文件]
  • -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -n或--quiet或--silent 仅显示script处理后的结果。
  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i : 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表示法!

举例(文件内容替换)

echo "Hello world" | sed 's/world/dear world/'

sed 用了 s 参数,是将 原文中的 world 替换成 dear world. 所以输出是 "Hello dear world"

对于文件的修改也是如此:

图1

从图1 看出,sed 命令替换了指定的内容,值得注意的是,sed 命令并不会修改文件本身,只是将文件作为输入流,修改内容后发送到 STDOUT.文件本身并没有修改。当然,如果想修改,你可以通过STDOUT重定向实现,具体方法参看以前的文章有介绍过。值得注意的是,"sed s" 只会替换文本行中第一次匹配的内容,这点稍后会讲解。

从文件中读取命令

只需要用-f 参数指定命令文件即可,举例:

图2

图2中,将替换命令放到了 script1.sed 文件中,sed -f 指定命令文件对 data1.txt 文件内容输入流修改,并输出到终端。

gawk 程序

gawk 可以应用于日志处理,从日志文件中提取目标元素,并将其格式化为更加易读的报告。

gawk options program file
  • -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
  • -v var=value or --asign var=value
  • 赋值一个用户定义变量。
  • -f scripfile or --file scriptfile
  • 从脚本文件中读取awk命令。
  • -mf nnn and -mr nnn
  • 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

数据字段变量

  • $0 代表整个文本行
  • $1 代表文本行中第一个字段
  • ......
  • $n 代表文本行中第n个字段

图3

如图3,gawk 默认字段分隔符是空白字符,所以$3表示文本行中第3个字段。

从文件中读取命令

和sed 命令相似,gawk 也可以从文件脚本中读取命令参数。

图4

如图4, script2.gawk中,打印每行文本的第一个元素,以及第六个元素。

gawk -F: 指定冒号作为元素分隔符, 格式处理采用从文件中读取,passwd作为文件输入流。所以该命令打印了系统中用户以及对应的该用户的home 路径。

BEGIN/END 用法

BEGIN常用于头部信息格式化输出,END常用于尾部信息格式化输出,直接上例子

图5

上图中,script2.gawk 中,BEING 格式化了信息头,END 在打印结束后格式化了尾部信息。

sed 替换选项

上文提过,'sed s’ 只会替换行中第一个匹配的内容,如图:

图6

如图6,'sed s' 替换data4.txt中的test 内容,结果只替换了第一次出现test的地方。有时这并不是我们想要的结果,多以sed 为我们提供了更多的选项,从而实现更多的控制。格式为:

s/pattern/replacement/flag

flag的内容可以为如下的定义

  • 数字, 表明新文本将替换第几处匹配的地方
  • g, 表明新文本将会替换所有匹配的文本
  • p, 表明原先行的内容要打印出来
  • w file, 将替换的结果输出到文件中

举例:

图7

例子比较简单,就不赘述了。

sed 修改指定行的内容

sed 命令默认会修改所有行的内容,但有时我们可能希望修改指定行的内容,所以强大的sed 命令也为我们提供了行寻址的参数。主要有两种方式:

  • 数字方式寻址
  • 文本模式过滤特定行

数字寻址

通过指定某一行,或者指定行数区间,来实现更改部分行内容的控制,上例子

图8

通过在 ‘s’ 前加上特定行号或者行区间,实现目标行的修改,其中行区间通过 'n, ms'的格式来实现的,其中m>n, 如果想从某一行开始到最后一行,可以通过 'n,$s' 来实现。

文本模式过滤

格式为 /pattern/command, 其中pattern 可以是正则表达式, 举例

图9

删除行

上文介绍过,删除行可以通过 ‘sed d’来实现,同样支持删除指定行的内容,格式和替换指定行内容的格式相似,直接上例子:

图10

图10 例子非常简单,不再赘述。不懂得可以私信给我。

插入内容到指定行

想插入内容到指定行,可以通过 i,a 选项来实现。

  • i,插入内容到指定行的上一行,
  • a,插入内容到指定行的下一行

修改行内容

和插入命令用法相似,只是命令选项换成 c。

例子比较简单,不多解释了。有疑问的小伙伴可以随时私信我。

相关推荐

辞旧迎新,新手使用Containerd时的几点须知

相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使...

分布式日志系统ELK+skywalking分布式链路完整搭建流程

开头在分布式系统中,日志跟踪是一件很令程序员头疼的问题,在遇到生产问题时,如果是多节点需要打开多节点服务器去跟踪问题,如果下游也是多节点且调用多个服务,那就更麻烦,再者,如果没有分布式链路,在生产日志...

Linux用户和用户组管理

1、用户账户概述-AAA介绍AAA指的是Authentication、Authorization、Accounting,即认证、授权和审计。?认证:验证用户是否可以获得权限,是3A的第一步,即验证身份...

linux查看最后N条日志

其实很简单,只需要用到tail这个命令tail-100catalina.out输入以上命令,就能列出catalina.out的最后100行。...

解决linux系统日志时间错误的问题

今天发现一台虚拟机下的系统日志:/var/log/messages,文件时间戳不对,跟正常时间差了12个小时。按网上说的执行了servicersyslogrestart重启syslog服务,还是不...

全程软件测试(六十二):软件测试工作如何运用Linux—读书笔记

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到。对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux...

Linux运维之为Nginx添加错误日志(error_log)配置

Nginx错误日志信息介绍配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主...

Linux使用swatchdog实时监控日志文件的变化

1.前言本教程主要讲解在Linux系统中如何使用swatchdog实时监控日志文件的变化。swatchdog(SimpleWATCHDOG)是一个简单的Perl脚本,用于监视类Unix系统(比如...

syslog服务详解

背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。1什么是syslog服务1.1syslog标准协议如下图这里的fa...

linux日志文件的管理、备份及日志服务器的搭建

日志文件存放目录:/var/log[root@xinglog]#cd/var/log[root@xinglog]#lsmessages:系统日志secure:登录日志———————————...

运维之日志管理简介

日志简介在运维过程中,日志是必不可少的东西,通过日志可以快速发现问题所在。日志分类日志分类,对不同的日志进行不同维度的分析。操作系统日志操作系统是基础,应用都是在其之上;操作系统日志的分析,可以反馈出...

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过

这两天沸沸扬扬的Log4j2漏洞门事件炒得热火朝天:突发!ApacheLog4j2报核弹级漏洞。。赶紧修复!!|Java技术栈|Java|SpringBoot|Spring...

Linux服务器存在大量log日志,如何快速定位错误?

来源:blog.csdn.net/nan1996jiang/articlep/details/109550303针对大量log日志快速定位错误地方tail/head简单命令使用:附加针对大量log日志...

Linux中查看日志文件的正确姿势,求你别tail走天下了!

作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了。尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是cat,tail,vi(或...

分享几款常用的付费日志系统,献给迷茫的你!

概述在前一篇文章中,我们分享了几款免费的日志服务器。他们各有各的特点,但是大家有不同的需求,有时免费的服务器不能满足大家的需要,下面推荐几款付费的日志服务器。1.Nagios日志服务器Nagio...

取消回复欢迎 发表评论: