sed编辑器被称为流编辑器,根据命令处理数据流中的数据。
sed命令格式如下:
sed options script file
选项为:
-e script 将script中指定的命令添加到已有的命令中
-f file 在处理输入时,将file中指定的命令添加到已有命令中
-n 不产生输出,使用print命令完成输出
# 示例,将文件中的brown替换为green,将dog替换为cat
$ sed -e 's/brown/green/;s/dog/cat/' data.txt
gawk程序时Unix中的原始awk程序的GUN版本。gawk程序的报告生成能力通常用来从大文件中提取收据元素,并将它们格式化成可读的报告。其中最完美的例子就是格式化日志。
gawk程序的基本格式如下:
gawk options program file
可选项为:
-F fs 指定分隔符
-f file 从指定文件中读取程序
-v var=value 定义gawk程序的变量及其默认值
-mf N 指定要处理数据文件中最大字段数
-mr N 指定要处理数据文件中的最大数据行数
-W keyword 指定gawk的兼容模式或警告等级
gawk程序脚本要用一对花括号来定义,并且需要将脚本放到单引号中。
# 该命令没有在命令行中指定文件名,所以gawk程序会从STDIN接收数据,所以需要输入一段文本后回车,查看结果,想要终止程序,需要使用CTRL+D来产生一个EOF字符,从而终止该程序。
gawk '{print "hello world!"}'
gawk的主要特性之一就是其处理文本文件中的数据的能力。它会自动为每个原素分配一个变量。默认情况下,gawk会将如下变量分配给它在文本中发现的数据字段:
- 0代表整个文本行− 0 代 表 整 个 文 本 行 − 1 代表文本行中的第一个数据字段
- 2代表文本行中的第二个数据字段− 2 代 表 文 本 行 中 的 第 二 个 数 据 字 段 − n 代表文本行中的第n个数据字段
gawk程序中默认的字段分隔符是任意的空白字符(空格或制表符),亦可以使用-F
选项指定分隔符。
# 输出/etc/passwd文件每行的第一个数据字段值,分隔符为:。
$ gawk -F":" '{print $1}' /etc/passwd
gawk允许指定程序脚本何时运行,默认情况下,程序会从输入中读取一行文本,然后对该行执行脚本,有时需要在处理数据前运行其他脚本,例如创建标题。所以BEGIN
关键字就是做这个的。它会强制gawk在读取数据前执行BEGIN关键字后指定的脚本。与BEGIN类似,END
关键字允许你指定一个程序脚本,在gawk读完数据后执行它。这是在处理完所有正常数据后给报告添加页脚的最佳方法。
$ gawk 'BEGIN{print "the data file contents:"}{print $0}END{print "End of file"}' /etc/passwd
我们已经试过如下的命令了:
$ sed '/s/test/trial/' data.txt
默认情况下,它只替换每行中出现的第一处,要让替换命令能够替换一行中不同地方出现的文本,则需要使用替换标记,替换标记在替换命令字符串之后设置。
格式如下:
s/pattern/replacement/flags
其中可用的替换标记有如下四种:
- 数字 表明新文本将替换第几处模式匹配的地方
- g 表明新文本将会替换所有匹配的文本
- p 表明原先行的内容要打印出来,通常与sed命令的-n
选项一起使用,禁止sed命令输出,p替换会输出修改过的行,因此二者配合就是只输出修改过的行。
- w file 表明将替换的结果写入文件中
默认情况下,sed编辑器使用的命令会作用于文本数据的所有行。如果只想命令作用于特定行或者是某些行,则必须用行寻址
。
- 以数字形式表示行区间
- 用文本模式来过滤出行
两种形式都使用相同的格式来指定地址:
address command
address {
command1
command2
command3
}
# 数字寻址
# 修改第二行
$ sed '2s/dog/cat/' data.txt
# 修改第二行到第三行
$ sed '2,3s/dog/cat/' data.txt
# 修改第二行到最后一行
$ sed '2,$s/dog/cat/' data.txt
# 文本模式过滤器
# 修改匹配到 samantha 行的数据
$ sed '/samantha/s/dog/cat/' data.txt
文本替换不是sed编辑器唯一的命令,它还可以删除文本流中的特定行。删除命令d
会删除匹配指定寻址模式的所有行,如果忘记加入寻址模式,则会删除所有行。
# 删除第三行
$ sed '3d' data.txt
# 删除第二行到第三行
$ sed '2,3d' data.txt
# 删除第三行到最后一行
$ sed '3,$d' data.txt
# sed编辑器的模式匹配特性也适用于删除命令,删除第一行
$ sed '/number 1/d' data.txt
sed编辑器不会修改原始文件,删除的行只是从sed编辑器的输出中消失了,原始文件仍然包含哪些删除的行
sed编辑器允许向数据流插入和附加文本行。
- 插入(insert)命令(i)会在指定行前增加一行
- 附加(append)命令(a)会在指定行后增加一行
# 在test line 1前插入一行 test line 2
$ echo "test line 2" | sed 'i\test line 1'
# 在第三行前 插入一行 new content line
$ sed '3i\new content line' data.txt
# 在第三行后 追加一行 new content line
$ sed '3a\new content line' data.txt
# 要插入多行,则每行文本都需要加反斜杠\
# 修改第三行的内容为指定内容
$ sed '3c\'
this is a changed line' dadta.txt
# 原意是修改第二行和第三行,实际上却是使用该内容将第二行第三行替换。而不是逐一修改这两行。
$ sed '2,3c\'
this is a changed line' dadta.txt
参考文章:
1. Linux命令行与脚本编程大全