linux三剑客之sed、awk 3.23
grep在正则表达式中学习过,今天主要讲解另外两个sed和awk
一.sed相关
sed一次处理一行内容,处理时先将内容存到缓冲区中,然后sed命令处理缓冲区中的内容,处理完之后把这些内容输出到屏幕,再处理下一行,直到文件末尾,原文件内容并没有改变,除非你使用重定向存储输出改变。
定址:确定行数范围;定界:确定列数范围。
1.sed的命令形式: sed [选项] ‘command ’ 文件名 sed [选项] -f scriptfile 文件名
常用选项: -n∶安静模式。加上 -n 参数后,只有经过sed 特 殊处理的那一行(或者动作)才会被列到屏幕上。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内,-f filename 则可以执行 filename 内的sed 动作;
-r∶支持延伸型正规表示法的语法。(相对于基础正则表达式不需要转义字符"\")
-i∶直接修改文件内容
常用命令(也就是'command')
a:新增,后面可以接字串,目前的下 一行添加该字符串
c:取代,后面接字串,这些字串可以取代n1,n2 之间的行(定址的行)
d:删除内容
i:插入,后面接字串,这些字串会在目前的上一 行出现
p:列印,即将某个选择的内容打印出来。通常 p 会与参数 sed -n 一起运 作
s:替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g (1到20行old替换为new)
2.sed命令的实例
(1)删除和显示、查询
$表示最后一行。
使用模式进行查询
[[email protected] ruby] # sed -n '/\$/p' ab #查询包括关键字$ 所在所有行,使用反斜线\屏蔽特殊含义
(2)添加
[[email protected] ruby] # sed '1a drink tea' ab #第一行后增加字符串 “drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
[[email protected] ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
[[email protected] ruby] # sed '1a drink tea\nor coffee' ab #第 一行后增加多行,使用换行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end
[[email protected] ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"
(3)替换
[[email protected] ruby] # sed '1c Hi' ab #ab中第一行代替为Hi
[[email protected] ruby] # sed '1,2c Hi' ab #ab中第一行到第二行代替为Hi
替换一行中的某部分 格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串 可以用正则表达式)
数据的搜寻并执行命令
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令 ,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行 :
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'1 root:x:0:0:root:/root:/bin/blueshell
二.awk相关
awk 比较倾 向于一行当中分成数个『字段』来处理。 awk 相当的适合处理小型的数据数据处理。
1.awk命令形式
awk [options] 'script' var=value file(文件名)
awk [options] -f scriptfile(脚本文件)var=value file(文件名)
(1)常用选项[options]
(2) 一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用 语句块、END语句块3部分组成,这三个部分是可选的。
BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在 这里设置全局变量。
END:让用户在最后一条输入记录被读取之后发生的动作。
(3) awk运行流程:
第一步:执行BEGIN{ commands }语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重 复这个过程,直到文件全 部被读取完毕。
第三步:当读至输入流末尾时,执行END{ commands }语句块
(4)awk内置变量
实例:awk ‘END{print NR, $NR}’ filename
打印最后一行的行号(统计行数)和最后一行的内容
(5)变量值的传递( -v )
(6)awk的运算和判断:
awk中的赋值运算和逻辑运算、关系运算和我们之前接触过的语言相同。
awk中的正则运算
在linux awk的while、do-while和for语句中允许使用 break,continue语句来控制流程走向,也允许使用exit退出
awk中,流程控制语句, 语法结构,与c语言类似。
数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索 引(下标)可以是数字和字符串在awk中数组叫 做关联数组(associative arrays)。