Linux命令:sed与gawk

1. 文本处理

1.1 sed 编辑器

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
1.2 gawk 程序

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
1.3 sed 编辑器基础
1.3.1 替换标记

我们已经试过如下的命令了:

$ sed '/s/test/trial/' data.txt

默认情况下,它只替换每行中出现的第一处,要让替换命令能够替换一行中不同地方出现的文本,则需要使用替换标记,替换标记在替换命令字符串之后设置。

格式如下:
s/pattern/replacement/flags
其中可用的替换标记有如下四种:
- 数字 表明新文本将替换第几处模式匹配的地方
- g 表明新文本将会替换所有匹配的文本
- p 表明原先行的内容要打印出来,通常与sed命令的-n选项一起使用,禁止sed命令输出,p替换会输出修改过的行,因此二者配合就是只输出修改过的行。
- w file 表明将替换的结果写入文件中

1.3.2 使用地址

默认情况下,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
1.3.3 删除行

文本替换不是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编辑器的输出中消失了,原始文件仍然包含哪些删除的行

1.3.4 插入和附加文本

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
# 要插入多行,则每行文本都需要加反斜杠\
1.3.5 修改行
# 修改第三行的内容为指定内容
$ sed '3c\'
this is a changed line' dadta.txt
# 原意是修改第二行和第三行,实际上却是使用该内容将第二行第三行替换。而不是逐一修改这两行。
$ sed '2,3c\'
this is a changed line' dadta.txt

参考文章:
1. Linux命令行与脚本编程大全

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值