调用sed有两种形式
sed [-nefri] 'command' file(s)
sed [-nefri] -f scriptfile file(s)
-n : 安静模式。在一般的sed语法中,所有来自STDIN的资料都会被列到萤幕上。但加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来。
-e : 直接在指令列模式进行sed的动作编辑
-f : 直接将sed动作写在一个档案内,-f filename 则可以执行filename内的sed动作
-r : sed动作支持是延伸型正规表示法的语法
-i : 直接修改读取的档案内容,而不是由屏幕输出
常用的命令
a : 新增,a的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c : 取代,c的后面可以接字串,这些字串取代n1,n2之间的行
d :删除,d后面通常不接任何内容
i :插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p :列印,将某个选择的内容打印出来,通常p与-n一块运作
s :替换,可以直接进行替换的工作,通常这个s的动作可以搭配正规表示法
数据的搜寻并执行命令
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换成blueshell,然后输出这行:
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
awk
相比较sed常常作为一整个行的处理,awk更倾向于一行中分成数个字段来处理。因此,awk相当的合适处理小型的数据处理。
awk [options] 'script' var=value file(s)
awk [options] 'scriptfile' var=value file(s)
-F fs fs指定输入分隔符,fs可以是字符串或者正则表达式
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令
awk脚本是由模式和操作组成的
BEGIN :让用户指定在第一条输入记录被处理之前所发生的动作,通常可以在这里设置全局变量
END : 让用户在最后一条输入记录被读取之后发生的动作
操作
操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:
•变量或数组赋值
•输出命令
•内置函数
•控制流命令
awk脚本基本结构
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这3部分是可选的。
执行原理:
第一步:执行BEGIN{ commands }语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{ commands }语句
awk内置变量
$n : 当前记录的第n个字段。比如说n为1的时候,就表示第一个字段
$0 : 这个变量包含执行过程中当前行的文本内容
FNR : 同NR,但是相对于当前文件
FS : 字段分隔符 (默认是任何空格)
NF : 表示字段数,在执行过程中对应于当前的字段数
NR : 表示记录数,在执行过程中对应与当前的行号
OFS :输出字段分隔符(默认是一个空格)
RS :记录分隔符 (默认是一个换行符)
ORS : 输出记录分隔符(默认值是一个换行符)