1. akw和sed基础
awk和sed有一些相似处:
1) 激活语法相同
2) 利用它们,用户可以指定为输入文件的每一行都执行的指令
3) 为匹配模式使用正则表达式
1.2激活语法
Command `script` filenames
这里command是awk或sed,script是可以被awk或sed理解的命令清单,filenames表示命令所作用的文件清单。
为避免shell执行替换,要使用单引号将script引起来。Script的真正内容对于awk和sed来说大大不同。
如果没有给出文件名,awk和sed都从STDIN中读入,这使得它们可用作其他命令的输出过滤器。
1.3基本操作
当awk和sed命令运行时,执行如下操作:
1) 从输入文件中读取一行
2) 为该行做一个拷贝
3) 在该行上执行所给的脚本
4) 重复前三步
这些操作描述了awk和sed的主要特点,它们提供了使用单个脚本作用于文件中每一行或每条记录的方法。当读取完每条记录后,输入文件被关闭。若输入文件时在filenames中指定的最后一个文件,则退出命令。
脚本结构及脚本的执行
Awk或sed所指定的脚本包含一行或多行记录,这些记录的格式为:
/pattern/action
这里pattern为正则表达式,action表示一些动作。
当awk或sed正在执行一个脚本时,它们为每条记录执行如下过程:
1) 顺序搜索每个pattern直到发生一个匹配
2) 当发现匹配后,为输入行执行相应的动作
3) 当动作执行完毕,到达下一个模式并重复第一步
4) 当所有的模式都试过一遍后,读取下一行
在第四步执行前,sed显示被改动的记录,在awk中,必须手动显示这条记录。
Akw和sed中科院执行的动作有很大不同。在sed中,可以使用的动作包括编辑单个字母的命令。而在awk中,动作通常是一个编程语句集合。
2.使用sed
Sed是一个可用作过滤器的流编辑器,它读取每行输入然后执行一组请求动作,sed命令的基本语法为:
Sed `script` files
这里files是一个或多个文件清单,script是一个或多个按如下格式写出的命令:
/pattern/action
这里,模式pattern为正则表达式,action是命令。若pattern被删除,则为每一行都执行动作action。
在sed中可以利用的某些动作
动作 | 描述 |
P | 打印该行 |
d | 删除该行 |
s/patten1/pattern2 | 用第二种模式pattern2替代第一种模式pattern1 |
2.1 打印行
新建文件,并存储计算机配件价格清单数据
$ cat prices.txt
Cpu 500
Disk 300
Keyword 200
Network
Sound 500
Display 200
使用sed列出所有价格
$ sed ‘/[0-9].*$/p’ prices.txt
作用是:打印所有过滤出的价格行
Cpu 500
Cpu 500
Disk 300
Disk 300
Keyword 200
Keyword 200
Network asd
Sound 500
Sound 500
Display 200
Display 200
结果中,可以看出:匹配的结果都会显示重复的一行。其中Network是不匹配pattern的。
如果需要避免输出行为,可以为sed加上-n选项。
2.2 删除行
/pattern/d
例如:
$sed ‘/[0-9].*$/d’ prices.txt
将删除满足pattern条件的行。
注意:返回的结果可以通过管道方法,将删除后的结果存储到新的文件中
例如:$sed ‘/[0-9].*$/d’ prices.txt > newPrices.txt
newPrices.txt的内容:
$ cat newPrices.txt
Network asd
2.3 执行替换
假设现在需要将Prices.txt中的CPU更改为GPU,可通过sed命令s(s为substitute的首字母)。
/pattern/s/pattern1/pattern2
这里,pattern、pattern1、pattern2都是正则表达式。在s命令中,在任何匹配pattern的行中都用pattern2代替pattern1
通常,都会省略pattern,这是s命令的用法可以看作:
s/pattern1/pattern2
此时,s命令为行个输入行执行替换。
$ sed ‘/s/asd/600/’ prices.txt
将Network的错误价格asd替换为 600
a.执行全局替换
格式:$ sed ‘/s/pattern1/pattern2/g’ filenames
默认缺省行为只替换一次。
例如:
$ cat nash.txt
One two three four four four five six
$ sed ‘/s/four/number4/’ nash.txt
输出:One two three number4four four five six
后面的两个four没有影响。
通过g选项达到全局替换,$ sed ‘/s/four/number4/g’ nash.txt
b.重用表达式值
给prices.txt的价格前面加上美元符号$
$ sed ‘/.*/s/[0-9].*/$&’ prices.txt
分析:
Pattern:.*,作用匹配所有行
Pattern1:[0-9].*过滤出符合条件的行
Pattern2:将符合条件的数据存储在&,$&即在原有价格前加上美元符号$
输出结果:
Cpu $500
Disk $300
Keyword $200
Network asd
Sound $500
Display $200
因为Network不满足pattern1:[0-9].*所以没有进行操作
2.4 使用多个 sed命令
格式:sed –e ‘command’ –e ‘command1’ …. –e ‘commandN’
好处是:多次更新文件或替换,仅更新一次文件,所以高效而且不易出错。
2.5 管道中使用sed
在前面已经介绍了sed接收STDIN的输入。
$ ls /home | sed -n ‘/Jinyong/p’
返回ls /home中包含Jinyong字符的行