sed

sed命令
1.1、概念
vim/vi 采用的是交互式文本编辑模式
sed会按照此规则来编辑数据,实现无交互式编辑数据。
sed也是支持正则表达式的,如果要使用扩展正则加参数-r
大家需要注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据,并把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。
sed使用
sed 命令的基本格式如下:
[root@localhost ~]# sed [选项] ‘[动作指令]’ filename
选项
选项:
-n 默认情况下,sed 会在动作指令执行完毕后,自动输出处理后的内容,而该选项会屏蔽默认输出。
-e 执行多个sed指令
-i 此选项会直接修改源文件,要慎用,修改前建议先备份源文件。
-i.bak 编辑源文件的同时创造.bak的备份
-r 使用扩展的正则表达式
动作指令:
p 打印 ,输出指定的行
S 替换,替换指定字符串
d 删除,删除行
a 增加行,在当前行下面插入文件
i 增加行,在当前行上面插入文件
c 把选定的行改为新的指定的文本
r 读取文件,即用于将一个独立文件的数据插入到当前数据流的指定位置
w 另存为
注意:动作指令要是用单引号或双引号括起来。
sed常用动作指令:
打印(p指令)
我们先准备一个测试文件:
[root@localhost ~]# cat test.txt
my cat’s name is betty
This is your dog
my dog’s name is frank
This is your fish
my fish’s name is george
This is your goat
my goat’s name is adam

P指令表示搜索符号条件的行或指定范围的行,并输出该行的内容。
例1:搜索包含betty关键字的行并显示
注意:搜索条件要使用“/…/”括起来。

注:p指令是默认输出所有行,找到betty的行重复打印。
如果我想指定输出某行数据,就需要"-n"选项(禁止默认输出,只打印找到betty的行)。

可以看到,用 -n 选项和 p 命令配合使用,我们可以禁止输出其他行,只打印包含匹配文本模式的行。
如果需要对同一文件或行作多次指令动作,可以使用 “-e” 选项

替换(s指令)
我们先准备一个测试文件,文件内容如下:
[root@localhost ~]# cat test1.txt
it is hello too old to learn
it is hello too hello to learn never
when the cat is away,the mice will play
no cross,no crown

sed的s指令可以以行为单位进行部分数据的搜寻并替换。基本上sed的搜寻与替代的与vi相当的类似。
格式:sed ‘s/要被替换的字串/新的字串/g’
例如:[root@localhost ~]# sed ‘s/hello/never/g’ test1.txt
s            "替换"命令
  /…/…/      分割符 (Delimiter)
  hello         搜索字符串(要被替换的字符串)
  never        替换字符串(新的字符串)
注:其实 , 分割符 “/” 可以用别的符号代替 , 比如 ","或 "|“或”@"等 。
如:sed ‘s//usr/local/bin//usr/bin/’ filename
等价于 sed ‘s@/usr/local/bin@/usr/bin@’ filename
显然 , 此时用 “@” 作分割符比 “/” 好得多
注:匹配test1.txt文件中每一行的第一个hello替换为never,使用后缀/g标记会替换每一行中的所有匹配。
[root@localhost ~]# sed ‘s/hello/never/’ test1.txt //只替换每行出现的第一个词
it is never too old to learn
it is never too hello to learn never
when the cat is away,the mice will play
no cross,no crown
[root@localhost ~]# sed ‘s/hello/never/2’ test1.txt //只替换每行出现的第二个词
[root@localhost ~]# sed ‘s/hello/never/g’ test1.txt //全局替换
说明:/表示定界符,定界符是可以自定义的
[root@localhost ~]# head -5 /etc/passwd > mima
[root@localhost ~]# head -2 mima
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
[root@localhost ~]# head -2 mima |sed ‘s@/sbin/nologin@/bin/bash@’
[root@localhost ~]# head -2 mima |sed ‘s/sbin/nologin/bin/bash/’
按行查找替换
如果想把某行注释掉,让它不再生效,则可以这样做:
例如:将test2.txt文件的第4行注释掉

如果想把某个字符串(如never)替换为空,则可以这样做:

取得ens33网卡IP地址:

sed -e ‘s/never/@@/’ -e ‘s/cat/dog/’ test2.txt //第二种用-e选项 sed ‘s/never/@@/;s/cat/dog/’ test2.txt 两种写法相等
删除行(d指令)
如果需要删除文本中的特定行,可以用d指令,它会删除指定行中的所有内容。但使用该命令时要特别小心,如果你忘记指定具体行的话,文件中的所有内容都会被删除。
[root@localhost ~]# sed ‘2d’ test1.txt //指定行号删除
it is hello too old to learn
when the cat is away,the mice will play
no cross,no crown
通过特殊的文件结尾字符,比如删除test1.txt文件内容中第 3 行开始的所有的内容:

[root@localhost ~]# sed ‘/cat/d’ test1.txt //根据匹配的内容去删除
it is hello too old to learn
it is hello too hello to learn never
no cross,no crown
注:在此强调,在默认情况下 sed 并不会修改原始文件,这里被删除的行只是从 sed 的输出中消失了,原始文件没做任何改变。
添加行(i指令和a指令)
命令i(insert插入),在指定行前面插入一行
命令a(append附加),在指定行后面添加一行
它们的基本格式完全相同,如下所示: a(或 i)\新文本内容

修改行(c指令)
c 命令表示将指定行中的所有内容,替换成该选项后面的字符串。
"c"动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用"s"动作了。
指令c的格式:c\用于替换的新文本
[root@localhost ~]# cat test1.txt
it is hello too old to learn
it is hello too hello to learn never
when the cat is away,the mice will play
no cross,no crown
[root@localhost ~]# sed ‘2,$c\hello world’ test1.txt
it is hello too old to learn
hello world

sed ‘/SELINUX=enforcing/c\SELINUX=disabled’ /etc/selinux/config

对文件的保存和读取
例1:读取
r 命令用于将一个独立文件的数据插入到当前文件的指定位置,该命令的基本格式为:[address]r filename
sed 命令会将 filename 文件中的内容插入到 address 指定行的后面,比如说:
[root@localhost ~]# sed ‘3r /etc/hosts’ test1.txt

如果你想将指定文件中的数据插入到当前文件的末尾,可以使用 $符,例如:

/etc/hosts里的内容被读进来,显示在与test1.txt匹配的行后面,如果匹配多行,则/etc/hosts的内容将显示在所有匹配行的下面:

例2:写入
将test1.txt文件修改的行写入test11.txt文件中。

在test1.txt中所有包含hello的行都被写入test12.txt里:

对原文件直接修改
-i选项:此选项会直接修改源文件
[root@localhost ~]# sed -i ‘s/cat/dog/’ test1.txt
[root@localhost ~]# cat test1.txt
it is hello too old to learn
it is hello too hello to learn never
when the dog is away,the mice will play
no cross,no crown
[root@localhost ~]# sed -i.bak ‘s/dog/cat/’ test1.txt
去除行首数字
[root@localhost ~]# cat test2.txt
1234 it is never too old to learn
999 it is never too never to learn never
when the cat is away,the mice will play
353463463 no cross,no crown
ni hao xx nisdfsdf
[root@localhost ~]# sed -r ‘s/1+//g’ test2.txt
it is never too old to learn
it is never too never to learn never
when the cat is away,the mice will play
no cross,no crown
ni hao xx nisdfsdf
第六章 awk应用
1、awk的基础应用
概念
AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一
和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。
awk 命令的基本格式为:
awk [-F field-separator] ‘commands’ filename

在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格或tab键。
此命令常用的选项以及各自的含义,如表所示:
选项 含义
-F fs 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。
-v var=val 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。
awk 的强大之处在于commands,它由2部分组成,分别为匹配规则和执行命令,如下所示:
‘匹配规则{执行命令}’
awk命令的完整格式:awd [-F field-separator] ‘匹配规则{执行命令}’ 括起来。
举个简单的例子:
[root@localhost ~]# awk ‘/^KaTeX parse error: Expected group after '^' at position 114: …条件。 例如上面举的例子中'/^̲/ {print “Blank line”}’,/^KaTeX parse error: Expected group after '^' at position 29: …就是执行命令,当文件中有匹配/^̲/条件的行是就会执行pirnt命令。
匹配规则(即执行条件):
一般使用关系表达式作为条件。这些关系表达式非常多,具体参考下表:
条件类型 条 件 说 明
awk保留字 BEGIN 在awk程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次
awk保留字 END 在awk程序处理完所有数据,即将结束时执行。END 后的动作只在程序结束时执行一次
关系运算符 > 大于
< 小于
>= 大于等于
<= 小于等于
== 等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=”
!= 不等于
匹配表达式 ~(匹配) value ~ /regexp/ 如果value匹配/regexp/,则返回真
!~(不匹配) value !~ /regexp/ 如果value不匹配/regexp/,则返回真
正则表达式 /正则表达式/ 如果在“//”中可以写入字符,则也可以支持正则表达式,如:/root/表示匹配含有root的行。
逻辑运算符 && 逻辑与
|| 逻辑或
例如:
[root@localhost ~]# awk -F: ‘ 7   / b a s h 7 ~ /bash 7 /bash/ {print $1}’ /etc/passwd
判断 7 ( 第 7 个 数 据 字 段 ) 的 值 是 否 匹 配 正 则 表 达 式 / b a s h 7(第7个数据字段)的值是否匹配正则表达式/bash 77/bash/
[root@localhost ~]# awk -F: ‘ 7 !   / b a s h 7 !~ /bash 7! /bash/ {print $1}’ /etc/passwd
判断 7 ( 第 7 个 数 据 字 段 ) 的 值 是 否 不 匹 配 正 则 表 达 式 / b a s h 7(第7个数据字段)的值是否不匹配正则表达式/bash 77/bash/
awk 使用数据字段变量
前面说过,在 awk 中,默认的字段分隔符是任意的空白字符(例如空格或制表符)。 在文本行中,每个数据字段都是通过字段分隔符划分的(-F选项指定的分隔符)如/etc/passwd文件中可以将“:”当做字段分隔符,共划分成7个数据字段。
awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据字段分配一个变量。
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:
$0 代表整个文本行;
$1 代表文本行中的第 1 个数据字段;
KaTeX parse error: Unexpected character: '' at position 21: …本行中的第 2 个数据字段; ̲n 代表文本行中的第 n 个数据字段。
执行命令(动作action):
awk的执行命令在大括号{ }内指明。动作大多数用来打印(即print指令),但是还有些更长的代码诸如i f和循环语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。
动作(Action):
格式化输出(print);
流程控制语句(if、while、for等);
例如:显示passwd文件中第1个第6个字段的信息


  1. 0-9 ↩︎

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值