引文:有的时候,我们需要自动处理文本文件中的文本,而不需要拉出全副武装的交互式文本编辑器。这种情况下,有个能够自动地格式化、插入、修改或删除文本元素的命令行编辑器就方便多了。
幸运的是Linux系统提供了两个编辑器,sed和gawk,下面来初步认识下这两个编辑器。
sed编辑器被称作为流编辑器(stream editor),跟普通交互式文本编辑器恰恰相反。在文本编辑器中(比如vim),你可以使用键盘命令来交互式地插入、删除和替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
它会将生成的数据输出到STDIN。
sed命令使用格式如下:
sed options script file
option选项有:
命令行简单测试如下:
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就是这么牛逼。
命令行下输入命令:
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。
把命令写到script1文件中
s/lazy/health/
s/dog/cat/
使用-f
命令来制定文件:
sed -f script data1
会得到上面相同的效果。
gawk是Unix中的原始awk程序的GNU版本。在gawk编程语言中,你可以做下面的事情:
gawk option program file
gawk '{print "hello john!"}'
上述命令会在每行文本执行一遍程序脚本,输出“hello john!”.
如:
gawk '{print $1} ' data1
如下所示:
echo "my name is none!" | gawk '{$4="null";print $0}'
和sed一样使用-f指定,script2文件内容:
{print $1 "'s home directory is " $6}
命令行执行命令:
gawk -F: -f script2 /etc/passwd
输出结果如下图所示:
使用BEGIN,如下
gawk 'BEGIN{print "the program begining"} {print $0}' data2
会执行BEGIN指定的内容。
使用END,如下:
gawk 'BEGIN{ print "the program begining"} {print $0} END{print "END of File"}' data2
【1】Linux命令行与shell脚本编程大全(第二版)
本栏目Linux学习专题持续更新中…