Linux学习-高级shell脚本编程(二)初识sed和gawk


引文:有的时候,我们需要自动处理文本文件中的文本,而不需要拉出全副武装的交互式文本编辑器。这种情况下,有个能够自动地格式化、插入、修改或删除文本元素的命令行编辑器就方便多了。

幸运的是Linux系统提供了两个编辑器,sed和gawk,下面来初步认识下这两个编辑器。

1.sed编辑器

sed编辑器被称作为流编辑器(stream editor),跟普通交互式文本编辑器恰恰相反。在文本编辑器中(比如vim),你可以使用键盘命令来交互式地插入、删除和替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

它会将生成的数据输出到STDIN。

sed命令使用格式如下:

sed options script file

option选项有:

-e 将script中指定的命令添加到运行的命令中; -f 将file中指定的命令添加到运行的命令中; -n 不要为每个命令生成输出,等待print命令来输出。

1.1 在命令行定义编辑器命令

命令行简单测试如下:

echo "this is my test " | sed 's/test/big test/

输出结果如下所示:

===============
this is my big test

===============

对于一个文本文件data1,内容如下
this is a lazy dog
this is a lazy dog
this is a lazy dog
this is a lazy dog
this is a lazy dog
this is a lazy dog
this is a lazy dog

使用下列命令:

sed 's/dog/cat/' data1

得到输出如下所示:

===============
this is a lazy cat
this is a lazy cat
this is a lazy cat
……

===============

认真看看,可以看出该命令是将‘dog’换成了‘cat’,是不是感觉很神妙呀,是的,sed就是这么牛逼。

1.2在命令行使用多个编辑器命令

命令行下输入命令:

sed -e 's/lazy/health/; s/dog/cat/' data1

输出如下所示:

================
this is a health cat
this is a health cat
this is a health cat
……

===============

看看下面另一种输入的例子
这里写图片描述

注意:sed自身不会修改文本文件的数据。它只会将修改后的数据发送到STDOUT。
这里写图片描述

1.3从文件中读取编辑器命令

把命令写到script1文件中

s/lazy/health/
s/dog/cat/

使用-f命令来制定文件:

sed -f script data1

会得到上面相同的效果。

2.gawk程序

gawk是Unix中的原始awk程序的GNU版本。在gawk编程语言中,你可以做下面的事情:

定义变量来保存数据; 使用算术和字符串操作符来处理数据; 使用结构化编程概念,比如if-then语句和循环,来为数据增加逻辑; 提取数据文件中的数据元素并将它们按照另一顺序或格式重新放置,从而生成格式化报告。

2.1gawk命令格式

gawk option program file

2.2从命令行读取程序脚本

gawk '{print "hello john!"}'

上述命令会在每行文本执行一遍程序脚本,输出“hello john!”.

2.3使用数据字符变量

$0代表整个文本行 $1代表文本行中的第一个数据字段 $2代表文本行中的第二个数据字段 $n代表文本行中的第n个数据字段

如:

gawk '{print $1} ' data1

2.4在程序中使用多个命令

如下所示:

echo "my name is none!" | gawk '{$4="null";print $0}'

2.5从文件中读取文件

和sed一样使用-f指定,script2文件内容:

{print $1 "'s home directory is " $6}

命令行执行命令:

gawk -F: -f script2 /etc/passwd

输出结果如下图所示:
这里写图片描述

2.6在处理数据之前运行

使用BEGIN,如下

gawk 'BEGIN{print "the program begining"} {print $0}' data2

会执行BEGIN指定的内容。

2.7在处理数据之后运行

使用END,如下:

gawk 'BEGIN{ print "the program begining"} {print $0} END{print "END of File"}' data2

相关内容