Sed、Awk

本文介绍了Sed和Awk这两个强大的文本处理工具。Sed主要用于文本解析和转换,其工作流程包括读取、执行和显示,常用命令包括a、c、d、i、p、s等。Awk则是一种文本分析语言,适用于数据处理和统计分析,它以行作为处理单位,支持字段分隔和内置变量,如FS、NF、NR等。文章详细阐述了Sed和Awk的基本用法、选项、操作以及在shell脚本中的应用。
摘要由CSDN通过智能技术生成

sed ( SLreamEDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进符编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互.的情况下实现相当复杂的文本处理操作,被广泛应用于shell脚本中,用以完成各种自动化处理任务。

scd的工作流程主要包括读取、执行和显示三个过程。

读取:sed

从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,patternspace) 。

执行:默认情况下,所有的:tcd 命令都在模式空问中顺序地执行,除非指定了行的地址,否则 sced命令将会在所有的行上依次执行。

显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

读入新的一行内容到缓存空间;

从指定的操作指令中取出第一条指令,判断是否匹配pattern;

如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;

如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;

当所有行都处理完之后,结束;

注意:默认情况下所有的sed

命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

1.sed命令常见用法

通常情况下调用sed 命令有两种格式,如下所示。其中,“参数”是指操作的目标文件,

当存在多个操作对象时用,文件之问用逗号“,"分隔;而scriplile 表示脚木文件,需要用“-[”

选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。

sed [选项] '操作'参数

sed |选项] -f  scriptfile 参数

常见的sed命令选项主要包含以下几种。

-e或--expression=:表示用指定命令或若脚木来处理输入的文木文件。

-f或--file=: 表示用指定的脚本文件来处理输入的文本文件。.

-h或--help: 显示帮助。

-n、--quiet或silent:表示仅显示处理后的结果。

-i.bak: 直接编辑文木文件。

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

-s将多个文件视为独立文件,而不是单个连续的长文件流

“操作"用于指定对文件操作的动作行为,也就是sed的命令。通常情况下是采用的“[n1[,n2]]"操作参数的格式。nl、n2是可选的,代表选择进行操作的行数,如操作需要在5~ 20行之间进行,则表示为“5,20

动作行为”。常见的操作包括以下几种。

a: 增加,在当前行下面增加一行指定内容。

c: 替换,将选定行替换为指定内容。

d: 删除,删除选定的行。

i: 插入,在选定行.上面插入一 行指定内容。

p: 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以

ASCII 码输出。其通常与“-n”选项一起使用。

s: 替换,替换指定字符。

y: 字符转换。

//输出所有内容,等同于cat test. txt

[ rooL@ localhosl ~]# sed -n ' 3p' test.txt  //输出第3行

[ root@localhost ~]# sed -n '3, 5p' test. txt  //输出3~5行

[ root@localhost ~]# sed -n 'p;n' test. txt  //输出所有奇数行,n表示读入下一-行资料

[ root@localhost ~]# sed -n 'n;p' test. txt  //输出所有偶数行,n表示读入下一-行资料

[ rooL@ localhosl ~]# 8ed -n '1, 5{p;n}' test.txt   //输出第1~5行之问的奇数行(第1、3、5行) he was

short and fat.

[root@localhost ~]# sed -n '10,${n;p]' test.txt   //输出第10行至文件尼之间的偶数行

#woood # AxyzxyzxyzxyzC

Mi sfortunes never come a lone/si ngle.

案列

ilconfig ena331sed -n 2p #直接显示第二行内容

在执行“sed -n '10,${n;p}'test.txt"命令时,读取的第1行是文件的第10行,读取的第2

行是文件的第11行,依此类推,所以输出的偶数行是文件的第11行、13行直至文件结尾, 其中包括空行。

以上是sed命令的基本用法,sed

命令结合正则表达式时,格式略有不同,正则表达式以“/”包围。 例如,以下操作是sed

命令与正则表达式结合使用的示例。

[root@localhost ~]# sed -n '/the/p' test. txt

//输出包含the的行

the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.

The year ahead will test our political establi shment to the 1 imit.

[rool@localhost ~]# sed -n '4,/.he/p' Lest.txt. //输出从第 4行至第一 一个包含the的行

the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.

[root@localhost ~]# sed -n ' /the/=' test. txt .

//输出包含the的行所在的行号,等号(=)用来输出行号

4

5

(2)删除符合条件的文本(d)

因为后面的示例还需要使用测试文件

test. txt,所以在执行删除操作之前需要先将测试文件备份。以下示例分别演示了sed

命令的几种常用删除用法。

下面命令中nl命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。

[ root@localhost ~]# nl test.txt 1 sed '3d' //删除第3行

1he was short and fat.

2He was wearing a blue polo shirt with black pants.

4Lhe tongue is boneless but it. breaks bones.12!

5google is the best tools for search keyword.

6The year ahead will test our political establishment to the limit.

//省略部分内容

[ root@ localhost ~]卅nl tost..txt | sod '3, 5d'

//删除第3~5行

lhe was short and fat.

2lle was wearing a blue po1o shirt with black pants.

6 The year ahead will test our political establ i shment to the limit.

7PT-3.141592653589793238462643383249901429

8a wood cross!

//省略部分内容

[ root@localhost ~]# nl test. txt |sed ' /cross/d'

//删除包含cross 的行,原木的第8行被删除;如果要删除不包含cross 的行,用!符号表示取反操作,

如' /cross/ ! d'

....//省略部分内容

woood t twooo0o0od # AxyzxyzxyzxyzC

I bet this place is really spooky late at night! Misfortunes never come alone/ single.

I shouldn't have lett so tast.

I rooL@localhost ~] sed '/\.$/d' test.txt / /删除以". "结尾的行

the Longue is boneless bul it breaks bones. 12 !

PI=3.141592653589793238462643383249901429

a wood cross !

Actions speak louder than words

#woood

 # #woooooood

# AxyzxyzxyzxyzC

l bet. this place is really spooky late at night!

注意:若是删除重复的空行,即连续的空行只保留一个,"cat -s test.txt"。

(3)替换符合条件的文木

在使用sed命令进行替换操作时需要用到s(字符串替换)、c(整行/整块替换)、y

(字符转换)命令选项,常见的用法如下所示。

sed 's/the/THE/' Leat.LxL //将每行中的第一一个the 替换为THE

sed 's/l/L/2'  test.txt //将每行中的第2个1替换为L

sed ' s/the/ TIlE/g' test. txt //将文件中的所有the替换为TIE

sed 's/o//g' test.Lxt //将文件中的所有o删除(替换为空串)

sed 's/^/#/' test.txt //在每行行首插入#号

sed ' /the/s/^/#/' test.txt //在包含the的每行行首插入#号

sed 's/$/EOF/' test.txt //在每行行尾插入字符串EOF .

sed '3, 5s/ the/THE/g' test.txt //将第3~5 行中的所有the 替换为THE

sed ' /the/s/o/0/g' test.txt //将包含the的所有行中的。都替换为0

sed -i .bak ' s/ SELTNUX-=disabled/ SELTNUX=enable/ ' /otc/sol inux/conf ig

(4)迁移符合条件的文本.

在使用sed命令迁移符合条件的文本时,常用到以下参数.

H:复制到剪贴板;

g、G:将剪贴板中的数据覆盖/追加至指定行;

w:保存为文件:

r:读取指定文件;

a:追加指定内容。具体操作方法如下所示。

I, i忽略大小写

sed ' /the/ {H;d};9G' test. txt//将 包含the的行迁移至文件末尾,{;}用于多个操作

sed '1, 5{H;d};17G' test.txt //将第1~5行内容转移至第17行后

sed ' /the/w out. file' test. txt//将包含the的行另存为文件out. file

sed '/the/r /etc/hostname' test. txt //将文件/etc/hostname 的内容添加到包含the的每行以后

sed '3aNew' test.txt //在第 3行后插入一个 新行,内容为New

sed ' /the/aNcw' test. txt.//在包含the 的每行后插入一个新行,内容为New

sed '3aNew1\nNew2' test.txt //在第3行后插入多行内容,中间的\n表示换行

(5)使用脚本编辑文件

使用sed脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-I”选项来调用。例如执行以下命令即可将第1~5行内容转移至第16行后。

sed '1,5{H;d};16G' test.txt //将第1~5行内容转移至第16行后

以上操作可以改用脚本文件方式:

[ root@localhost ~]# vi opt.list

1, 5H

1, 5d

16G

[ root@localhost ~]# sed -f opt.list test. txt

The year ahead will test our political establishment to the limit.

PI=3.141592 653589793238462643383249901429

a wood cross!

AcL ions speak louder Lhan words

#woood # #woooooood # AxyzxyZXyZXyZC

bet. this place is real ly spooky late at night! Misfortunes never come a lonc/singlc.

I shouldn't have lett so tast.

he was short. and fat.

He was wearing a blue polo shirt with black pants. The home of Football on BBC Sport online.

the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.

||表示上一-条命令执行失败后,才执行下一条命令

(6) sed直接操作 文件示例

编写一个脚本,用来调整vsftpd 服务配置,要求禁止匿名用户,但允许本地用户( 也允许写入)。

[root@lo calhost ~]f vim local_ only_ ftp. sh

#! /bin/bash

#指定样本文件路径、配置文件路径

SAMPLE ="/usr/ share/doc/vsftpd-3.0.2/EXAMPLE/ INTERNET_ S1TE/ vsftpd.conf "

CONFIG= " /etc/vsftpd/vsftpd. conf"

#备份原来的配置文件,检测文件名为/etc/vsttpd/vsttpd.cont.bak备份文件是否存在,若不存在则使用cp命令进行文件备份

[ ! -e"SCONF1G.bak" ] && cp SCONrIG SCoNr1G.bak #f 基于样本配置进行调整,覆盖现有文件

sed -e ' /^anonymous_ enable/s/ YES/NO/g' SSAMPLE > SCONFIG

sed -i -e ' /^1ocal_ enab1e/s/NO/ YES/g' -e ' /^write_ enab1e/s/NO/ YES/g' SCONFIG

grep "listen" SCONFIG || sed -i 'Salisten=-YES' SCONFIG

并启动vsftpd服务,并设为开机后自动运行

systemctl restart vsftpd systemctl enable vsftpd

[ root @localhost ~]# chmod +x local_ only_ ftp.sh

awk

概述:

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

它是专门为文不处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作数据可町以来自标准输入也可以是管道或这件

20世纪70年代诞生于贝尔实验室,现在centos7用的是gawk

之所以叫 AWK、是因为其取了三位创始人Alfred Aho,Peter Meinberger,和 Brian Kernighan的 Family Mame的首字符。

工作原理:

当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出

如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次

工作原理:

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个""字段"然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符"

&"表示"与"、"I表示"或"、"!"表示非";还可以进行简单的数学运算,如+、一、+、/、%、^分别表示加、减、乘、除、取余和乘方。

命令格式:

awk选项·模式或条件{操作}"文件1文件2 ...

awk -f脚本文件  文件1    文件2 ..

格式: awk关键字   选项   命令部分  '{xxxx} '   文件名

awk包含几个特殊的内建变量((可直接用)如下所示:

FS:指定每行文本的字段分隔符,默认为空格或制表位。

NF:当前处理的行的字段个数。

NR:当前处理的行的行号(宇数)。

$o:当前处理的行的整行内容。

$n:当前处理行的第n个字段(第n列)。

FLENAME:被处理的文件名。

Rs:行分隔符。awk从文件上读取资料时,将根据R.s的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是” \n'

简说:数据记录分隔,默认为\n,即每行为一条记录

awk常用内置变量: $1、 $2、NF、NR、$0

$1: 代表第- -列

$2:代表第二列以此类推

$0: 代表整行

NF:一行的列数(也包含最后一列)

NR:行数

逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END

BEGIN-般用来做初始化操作,仅在读取数据记录之前执行一次

END一般用来做汇总操作,仅在读取完数据记录之后执行一-次

其他内置变量的用法FS、OFs、NR、FNR、RS、ORS

[ root@localhost ~]# awk ' BEGIN{FS=":"}{print $1}' pass. Txt //在打印之前定义字段分隔符为冒号

root

bin

da emon

adm

1p

awk高级用法

定义引用变量

[root@localhost ~]# a=100

[root@localhost ~]# awk -v b="$a" 'BEGIN{print b} '  //将系统的变量a,在awk 里赋值为变量b,然后调用变量b

100

[root@localhost ~]# awk 'BEGIN{print "'$a'"}' //直接调用的话需要先用双引号再用单引 号

100

[root@localhost ~]# awk -vc=1 'BEGIN{print c}' //awk直接定 义变量并引用

调用函数getline,读取一行数据的时候并不是得到当前行而是当前行的下--行

[ root@ localhost ~]# df -h | awk ' BEGIN{getline}/root/ {print $0} '

/ dev/mapper/centos-root

50G

5.2G

45G

11号/

[root@localhost ~]# seq 10 | awk ' {getline;print $0}' // 显示偶数行

2

4

6

8

10

[root@localhost ~]# seq 10 |awk ' {print $O;getline}' // 显示奇数行

1

3

5

7

9

if语句: awk的if语句也分为单分支、双分支和多分支

单分支为if( ) { }

双分支为if( ) { }else{ }

多分支为if( ){ }else if( ) { }else{ }

[ root@localhost ~]# awk -F: ' {if($3<10) {print $0}}' /etc/pas swd

//第三列小于10的打印整行

[root@localhost. ~]# awk -F: '{if($3<10) {print $3}else{print $1}}' /etc/ pas swd

//第三列小于10的打印第三列,否则打印第一列

awk还支持for循环、while循环、函数、数组等

通过管道、双引号调用shell命令:

echo $PATH | awk 'BEGIN{RS=":"};END {print NR} '  #统计以冒号分隔的文本段落数,END{

}语句块中,往往会放入打印结果等语句

echo $PATH | awk ' BEGIN{RS=":"}; {print NR,$0} ;END {print NR} '
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值