Linux命令shell脚本编程学习笔记-18章初识sed和gawk

第18章 初识sed和gawk

18.1 文本处理

sed编辑器
sed编辑器可以基于输入到命令行的或是存储在命令文本文件中的命令来处理数据流中的数据。
它每次读取一行,用提供的编辑器命令匹配数据、按命令中指定的方式修改流中的数据,然后将生成的数据输出到STDOUT。在流编辑器将所有命令与一行数据进行匹配后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。
sed命令格式:
sed options script file
sed命令选项
-e script 在处理输入时,将script中指定的命令添加到运行的命令中
-f file 在处理输入时,将file中指定的命令添加到运行的命令中
-n 不要为每个命令生成输出,等待print命令来输出

#替换
$echo "this is a test" | sed 's/test/big test/'
this is a big test

在命令行使用多个编辑器命令
使用-e即可。
注意:多个命令都写在同一对引号之间,并用分号隔开。并且在命令末尾和分号之间不能有空格。

sed -e 's/brown/green/';s/dog/cat/ data1

从文件中读取编辑器命令
如果有大量要处理的sed命令,可以将这些命令放入一个文件中,用-f指定文件
sed -f script data1

gawk程序
gawk程序是Unix中的原始awk程序的GNU版本,它提供了一种编程语言不只是编辑器命令。
在gawk编程语言中,可以做下面的事:
1.定义变量来保存数据
2.使用算数和字符串操作符来处理数据
3.使用结构化编程概念,比如if-then语句和循环
4.提取数据文件中的数据元素并将他们按另一顺序或格式重新放置。

gawk option program file
gawk选项
选项 描述
-F fs 指定行中分隔数据字段的字段分隔符
-f file 指定读取程序的文件名
-v var=value 定义gawk程序中的一个变量以及默认值
-mf N 指定要处理的数据文件中的最大字段数
-mr N 指定数据文件中的最大数据行数
-W keyword 指定gawk的兼容模式或警告等级

18.2 sed编辑器基础
默认情况下,对匹配的内容只会替换一次。如果想要改变这种方式,需要使用替换标识。一共有4中替换标识
s/pattern/replacement/flags
(1)数字,表明将替换第几处模式匹配的地方
s/pattern/replacement/number
(2)g,替换所有在文本中出现过的地方
s/pattern/replacement/g
(3)p,表示原来行的内容要打印出来
s/pattern/replacement/p
(4)w file,将替换的结果写到文件中去
s/pattern/replacement/w file

sed -n ‘s/test/trial/p’
这种情况下,会输出被改变过的行的内容

替换字符
转义符

使用地址
默认情况下,sed会对所有行使用命令,如果只想将命令作用于特定某些行,需要使用行寻址(line addressing)
sed中有两种形式的行寻址:
1.行的数字范围
2.用文本模式来过滤出某行
两种形式都使用相同的格式来指定地址:
[address] command
也可以为特定地址将多个命令放在一起:
address {
command1
command2
command3
}

数字方式的行寻址
sed ‘2s/dog/cat/’ data1
只修改第二行匹配的
sed ‘2,5s/dog/cat/’ data1
只修改第二行到第五行匹配的
sed ‘2,$s/dog/cat/’ data1
修改第二行到最后一行匹配的

使用文本模式过滤器
/pattern/command
该命令只会作用到匹配文本模式的行上。sed在文本模式中采用正则表达式。

组合命令
需要对单行执行多条命令的话,可以使用花括号将多条命令组合在一起
$ sed ‘2{
s/This/That/
s/test/good test/
}’ test.txt

删除行(delete)
删除行的命令为d,如果不指定行号,那么就全部删除。
sed ‘3d’data1
删除第三行
sed ‘4,7d’ data1
删除4-7行

插入和附加文本
插入(insert)命令i会在指定行前加一个新行
追加(append)命令a会在指定行后加一个新行
sed ‘[address]command\
new line’

echo “Test line 2” |sed ‘i\Test line 1’
Test line 1
Test line2

echo “Test line 2” |sed ‘a\Test line 1’
Test line2
Test line 1

修改行(change)
和之前的使用完全一样
使用地址区间的时候需要注意,sed会把区间中的所有内容作为一个整体用新行替换
sed ‘3c\
this is a change line of text’ data1
将第三行替换成this is a change line of text

转换命令
转换(transform,y)命令是唯一可用来处理单个字符的sed编辑器命令
格式如下:
[addressly/inchars/outchars/
转换命令会对inchars和outchars按顺序做一个一一映射。
如果inchars和outchars长度不同,sed则会产生错误信息

sed ‘y/123/789’ data1
对应数字进行替换

回顾打印
用来打印数据流中的信息的命令:
1.p,用来打印文本行
2.等号(=)命令,用来打印行号
3.l(小写L)命令,用来列出行
打印行
和替换命令中的p标记类似,p命令可以打印sed编辑器输出中的一行

sed -n ‘/3/{p;s/line/Line/p}’ test.txt

打印行号
sed ‘=’ data1

列出行
此命令允许打印数据流中的文本和不可打印的ASCII字符。
任何不可打印字符都用他们的八进制值前加一个反斜线或标准C风格的命名法。

cat data1
this line contains tabs.
sed -n ‘l’data1
this\tline\tcontains\ttabs.$

用sed和文件一起工作

向文件写入
[address]w filename

sed ‘1,2w test’ data1
将data1中第一行和第二行写入到文件test中

从文件读取数据
[address]r filename
读取命令允许将一个独立文件中的数据插入到数据流中。
sed ‘3r data2’data1
将data2中的文件读取插入到data1第3行的末尾

你可能感兴趣的:(Linux)