sedawk手册Word文档下载推荐.docx
《sedawk手册Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《sedawk手册Word文档下载推荐.docx(21页珍藏版)》请在冰点文库上搜索。
1顺序收索每个模式pattern直到发现一个匹配
2发现匹配后执行action动作
3执行完成后,到达下一个action,执行第一步
4当所有模式试过一遍后,读取下一行。
在第四步前,sed显示被改动的记录,awk必须手动显示改动的内容,
Sed可以使用的动作包括编辑单个字母的命令,awk动作通常是一个编程语句集合。
Pattern包括普通字符和通配符。
.点号
*星号在此处意思是匹配前面字符出现0次以上
[chars]匹配chars中的任何一个字符,chars是一个字符序列。
可用“-”字符指出字符范围,“^”是chars中的第一个字符,则匹配未在chars中指定的字符
^匹配一行的开始
$匹配一行的末
\转义符号
[…]匹配括弧里面的任意字符,第一字符如果是^表示不包含所列示字符,如果里面包含’[]’符号时候,表示同时包含’[]’,如果是任选之一应写成’][’
\{n,m\}匹配前面的匹配n-m次;
\{n\}匹配前面的模式n次
Egrep和awk可以使用的特殊字符
‘\<
’‘\>
’
+匹配前面的正则表达式1次以上
?
匹配前面的正则表达式0次以上
|匹配前面或者后的表达式
()对正则表达式分组,设置匹配集合
Sed是先对第一个行应用所有编辑命令,在对第二个行。
即后一个命令处理的输入行是前一个命令处理后的输入行,而不是原始行输入行
{n,m}
例子:
/the/只匹配the单词
/^the/只匹配the单词开头的
/the$/只匹配the单词结束的
/^$/匹配空行/^.*$/整行
X,y行号范围从指定的x到y
X,y!
查询不包含x,y行
/pattern/pattern/查询包含2个模式匹配的行
/pattern/,x在给定的x行上匹配模式
X,/pattern/通过行号与模式匹配
X,/pattern/!
不包含此区间/!
不能空
#n加入文本中,默认输入行不显示
p打出该行
=显示匹配的行号
sed'
/a/='
显示匹配a的行号
d删除该行
a\在指定行后追加文本,格式
[address]a\符号‘\’必须加
Tese1\附加多行加‘\’,无此符号结束
Tese2\存为script文件
…..
Sed-fscript_filenameinput_filename
i\在指定行前追加文本,格式同a\
c\用文本替换指定行文本,格式同a\
r读入文件
w写文本到一个文件
q读取到/address/定位的行后退出
{}在定位的行上执行命令组,但必须已[^j]换行符分开。
左大括号必须在行尾,右打括号必须单独占一行。
大括号之后每空格。
大括号里面还可以对单独命令使用匹配
sed-n'
/a/{^J=^Jp^J}
跳过文本当前行,读入下一行
/a/{^Jn^Jp^J}'
n从另外一个文本中读入文本下一下行
替换
[adress]s/pattern1/replacement/flag
Flag的选择有
n1-512表示对模式中指定模式的第n次出现情况进行替换。
\2表示替换第二次匹配模式的字符串
gpw
正则表达式可以使用其他定界符
Replacement部分的特使字符
&
用正则表达式匹配的内容作替换
\n匹配第n个字串,在pattern中以”\(”“\)”确定一个字串,不需要保存的字符串可以不用括弧。
所有字符串任然作为一个匹配模式
\转义符。
可以用于转义换行符,即在替换部分换行(\后不能空格)
Flag可以组合使用
删除
d删除整行,默认使后续的匹配脚本不执行,而读入下一行。
追加插入更改
[address]a\i\c\
Text
要求命令第一行后必须用‘\’转义换行符,text文本必须从下一行开始,连续多行必须用’\’转义换行符,最后一行不转义,标志text结束。
追加命令、插入命令只能用于单个地址,更改命令可以用于一个范围内,即将整个区间替换成一个text。
而且text文本不作为后续脚本的输入行。
列表
(小写L),将非打印字符显示为两个数字的asic码,功能类似于vi中的(:
l)
转换
[address]y/abc/xyz/将对应的abc字符替换成xyz
打印
P
打印行号
=
下一步
[address]n
读入下一行取代当前行作为新输入,以后的命令作用新的输入行
读和写文件
[line-address]rfile
[address]wfile
命令和文件之间必须有空格。
每个脚本最多能打开十个文件。
写命令是处理完一个输入行以后,就写入文件。
读入的文件不作为输入行参与执行命令,但初始的当前输入行会继续执行剩下的命令
退出
[line-address]q
高级命令
处理多行模式空间N、D、P
保存模式空间的内容,用于后续命令。
H、h、G、g、x
条件选择:
、t、b
D匹配在多行上的字符串,但只删除多行模式中的第一行
追加下一行
N通过读取新的输入行,并将它添加到模式空间的现有内容之后来创建多行模式空间。
模式空间的初始内容与新加内容用\n分开并作为一个输入。
在多行模式空间中,^、$分别只匹配整个输入行的行首行尾。
执行N后,将合并后的输入行传递给后续输入命令。
在替换字符中无法使用\n输入换行符,可使用’\’在行尾转义一个换行符
’\^J’
/owner/{
N
s/*\n//
s/owerand/InstGuid/\
/
}
N在遇到最后一行的时候,因为没下一行而直接退出。
改为$!
N排除在最后一行使用N,可读入最后一行。
D删除模式空间中开始到第一个换行符的部分内容,并返回整个命令脚本的开始,将删除内容后的模式空间内容用于操作。
而不是读入新的输入行。
(在此前必须用N开启多行模式)
/^$/
{
N
/^\n$/D
P输出多行模式空间直到第一个换行符的位置。
一个循环读入输出的例子
/Unix/{
N
/\nSystem{
s//Opern&
P
D
}
此循环命令常用于跨行模式中有多个匹配的情况
保持空间
模式空间存放当前的输入行,保存空间可以用于暂存数据。
H、h将模式空间的内容追加或复制到保持空间
G、g将保持空间的内容追加或复制到模式空间
x交换保存空间和模式空间的值
上面的命令均可指定一个地址或者一个范围。
追加内容时候,前面放换行符隔开。
如果有中断或者控制,命令未执行到脚本底部将不会默认打印。
d是中断常用的一种,抑制默认打印。
如果有括弧’]’出现在字符类’[]’中的第一个时,它被当成普通字符而不作为右定界符。
分支命令
分支b测试t。
将命令转到包含特殊标签的行,如果没对应标签,将控制移植到脚本结束。
分支命令为无条件转移,t为有条件转移,只有当替换命令改变当前行时,会执行。
标签不得多与7个字符,:
mylable,冒号后不允许有空格。
在分支、测试命令处使用指定标签
bmylable(b后有空格)
分支[address]b[label]。
Label可选择,如没有,控制转移到脚本结尾处。
通过在地址后使用’!
’(可用于组合命令匹配地址前)可达到类似的效果。
Command1
/pattern/blabel
Command2
B
:
label
Command3
根据选择执行命令23。
测试命令
[address]t[lable],没给定label控制被转移到脚本的结尾处。
没有address表示该处执行时无条件。
pattern1/s/pattern1/pattern2/在匹配pattern的行中用pattern2替换pattern1
转换指令y
y/ABC/abc/用字符集2对应字母替代字符集1对应字母
sed–n–e“l”txt可现实txt文件中不可见字符的ansic码
Sed命令中可以使用shell变量,应使用双引号
替换命令后参数
‘g’替换所有出现的旧模式,默认值替换每行第一次出现的旧模式
‘p’显示被改动的行,默认不显示
Wfilename将替换后的行内容保存到filename
&
可用在pattern2中重用匹配pattern1的字符串,即替代旧字符串
sed–n可以不显示sed扫描过的行
sed–e“命令”–e“命令”
注解
sed'
/01/!
p'
tmp.txt显示不含有01的行
在sed中‘!
’号可以执行相反的条件操作,与sed-n'
/[^01]/p'
效果一直
Sed前面匹配模式可以直接是行数位置,如sed'
10q'
,扫描到第十行就退出,sed‘$=’到最后一行显示行号
分割付’/’也可以使用’,’(逗号)
awk
awk常用选择项
-e执行多条awk命令;
-F将字段分隔符改为其他符号,与-f区分开来
Awk–F,‘{print$1}’
-v跟随var=value在awk中变量var取shell变量value
分隔符
使用默认的空白字符作为分隔符,比如空格、制表符
定义FS使用单个字符作为分隔符
使用满足正在表达式的字符串作为分隔符,FS=“[‘:
\t]”使用三个中的一个为分隔符([]不能少)
表达式字符链接
表达式由常量、变量、操作符、函数正在表达式组成。
常量:
字符串和数字。
或者转义字符,如:
\a报警字符\b退格\f走纸符\n换行
\r回车字符\t水平制表符\v垂直制表符
\ddd将字符表示为1-3为八进制
\xhex十六进制\c任何需要字面表示的字符
变量,每个变量都有一个字符串型的值和一个数值型值,空格是字符串连接操作符。
如z=”hello”“word”,与不要中间的空格+引号是一样的。
算数操作符
+-*/%^(幂)**(取幂,但是一个扩展表达式)
参与算数运算的变量无初值或者不是算术值,则自动赋值0
变量赋值以后,直接使用。
赋值操作符
++、--、+=、-=、*=、/=、*=、^=
关系操作符和布尔操作符
比较操作符<
>
<
=>
===!
=
~匹配!
~不匹配
Value~/pattern/value匹配模式比较结果真,$5~/MA/第5个域匹配MA
Value!
~/pattern/value匹配模式比较结果假,$5!
~/MA/第5个域不匹配MA
布尔操作符||&
!
/pattern/{action}
去掉pattern正则表达式则对每行采取action动作。
系统内置变量
FILENAME当前输入文件的名称,不应该改变其值
NR输入文件的当期记录或者行编号,不应该改变值
NF当期记录或者行的当期域编号,不应该改变
OFS输出域分隔符,默认空格
FS输入域分隔符,默认tab或者空格
ORS输出记录分隔符,默认换行符
RS输入记录分隔符,默认换行符
FNR已被awk读取过的记录行总数目(单文件时等于NR)
ARGC命令行参数个人数(等于输入文件数+1)
ARGIND当前处理文件在数组ARGV内的索引(ARGV[1]是第一个输入文件)
OFMT数字的输出格式(默认%.6g)
ARGV命令行参数数组
ENVIRON存储系统环境变量的数组
CONVFMA用来控制数字到字符的转换。
默认值是”%.6g”,是用于浮点型数据的做法。
POSIX标准之后使用。
一般在begin模式可以改变分隔符,也可在脚本的其他地方更改,但它仅影响下一个输入行。
print输出时候,“.”会产生一个OFS分隔符
如果一条记录分布在不同行,可设置FS=’\n’RS=’’。
但要求记录之间有空行。
格式化输出
Awk中printf可以替代print。
printf(“输出模板”,参数列表),printf输出完成不会自动换行
格式说明:
c、d、i(整数,POSIX中增加)、e(用e表示的浮点型)、E(用E表示的浮点型)、f(浮点型)、g(浮点去掉末尾的0,e、f的转换形式)、G、O(无符号八进制)、s(字符串)、u(无符号十进制)、x(无符号十六进制,小写a-e)、X(大写A-E)。
用print、printf的时候可以动态的制定宽度和精度,用*号可以实现。
如
print(”%*.*f\n”,5,3,n);
print的默认输出精度可以设置OFMT系统变量来改变。
%-width.precisionfrormat-specifier对齐格式
使用shell变量
Awk不能直接使用shell变量,如果需要使用shell值需要在命令行将shell值转变为awk变量。
放在脚本的后面,输入文件的前面。
格式
Awk‘script’awkvale1=value1awkvalue2=value2+filename
Script是awk语法,awkvale是awk使用的变量,value1是取值。
同时,awk可以使用系统的环境变量、和shell命令的返回结果,传递方式一样。
但不能在begin过程中不能使用命令行参数。
使用参数-v指定在BEGIN过程之前等到变量赋值。
-v+变量赋值参数在script之前,且一个参数使用一个-v
流控制
If(expression1)
Action1
Elseif(expression2)
Action2
}else
Ation3
While(expression)
Action
}
Do{
Action
}While(condition)
For(;
;
){action}
Continuebreak
Next读入下一个输入行,并返回脚本的顶部
Exit输入退出循环,找到end规则执行后退出脚本。
如果在end中使用exit,则终止脚本执行退出。
三元耳目
expr?
action1:
action2
数组
array[subscript]=value直接使用赋值即可
关联数组
关联数组的优点是其下标可以是一个字符串。
array[$1]=$2
特殊的循环语法可以访问关联数组的所有元素
for(variableinarray)
Dosomethingwitharray[variable]
例如:
for(iteminacro)
Printitem,acro[item]
相当于item循环取出acro里面的下标,供操作。
但使用实数作为下标的时候,有问题,会将实数转化为整数。
多维数组
可以采用m,n的方式模拟多维数组,awk本身存放的一维线性数组。
多维数组的下标解释为真实的下标m和n使用系统变量SUBSEP默认(\34)来连接的。
即m\034n
多维测试表达式(m,n)inarray
多维循环表达式For(iteminarray)。
使用split(iten,substr,SUBSEP)来访问单独的下标。
系统变量的数组
ARGV命令行参数的数组,不包含脚本本身和awk本身的选项。
ARGC存放参数个数,通常包含输入的文件名称。
ENVIRON环境变量的数组,下标为环境变量名称,元素是对应的值。
可以使用forin语句来遍历ENVIRON数组。
在使用shell中调用awk时,可以使用$*将命令行的参数一次性传给awk使用。
$*是shell脚本的命令行参数,包含脚本名字和参数,将其赋值给argv以后,awk会把argv的值作为输入文件名称。
使用系统变量作为数字下标时,用引号将shell系统变量。
测试数组成员
关键词in,表达式iteminarray,如果array[item]存在返回1,不存在返回0
‘-’表示从标准输入读入
分隔函数split
N=split(srintg,array,separator)
将string按separator做分隔符分隔到array数组中,返回array的下标n即数组最大个数。
不指定separator将FS作为默认分隔符,分隔符可以是完整的正则表达式。
删除数组元素
Deletearray[subscript]
删除数组中subscript元素。
后用in测试返回假。
函数
系统函数
数值函数
Int(x)取整数,不四舍五入。
使用printf%.0f可实现
Sqrt(x)平方
Exp(x)e的x次方
Log(x)e的对数
Sin(x)
Cos(x)
Atan2(y,x)y/x的arctangent值
Rand()等到相同的随机数列,0-1之间,不包含0、1
Srand(seed)将随机的seed设置x,x相同得到相同随机数。
Srand()默认seed为当期日期时间值,得到随机数不重复。
返回值是种子seed
Srand()再次使用时默认使用上次srand设置的seed值,以保持可重复测试相同随机数据。
三角函数sin()cos()用弧度表示的角度作为参数。
字符函数
Index(in,find)找出字串find在in第一次出现的位置,没有则返回0
Length(s),返回s的长度,没有给出s返回$0的长度。
Match(s,r)返回正则表达式r在s中第一次出现的位置。
无则返回0。
设置RESTART匹配字串的开始位置和RLENGTH匹配字符串的字符数。
Sprintf(fmt,expr1,…)按指定格式给fmt组成字符串,类似C语言sprintf
Sub(p,r,t)在字符串t中找到第一次匹配正则表达式p出现位置用r替换。
成功返回1,失败返回0。
没给出t默认$0
gsub(p,r,t)在t中用用r替换所有和正则表达式匹配的p。
没有给出t,默认为$0。
返回替换的个数
substr(str,st,len)在str中st位置开始返回len个字符串,len不出现,返回到结束
split(s,a,fs)把s用正则表达式fs做分隔符分隔成字符数组a,并返回a的下标
tolower(str)把str改为小写,返回新串
toupper(str)把str改为大写,返回新串
字符串函数使用正则表达式的地方,需用//包括正在表达式
Close(filename)将输入或输出文件filename关闭
System(cmd)调用操作系统命令,
自定义函数
Functionfun_name(parameter_list)
Body_of_func
(return)
当调用用户自定义函数时,在函数名与左括号之间可以没有空格。
对内置函数是不适合的,
在parameter_list参数列表中定义的参数是局部变量,但在函数体内定义的变量时全局变量。
在编写好多个函数后,-f参数可以包含脚本名称。
一个脚步名称使用-f,与include相识。
高级讲解
getline用于从输入中读入一行。
不仅可以读入正常的输入流,还可以处理来自文件和管道的输入。
与next语句有点类似,但是getline在得到下一行的时候,没改变脚本控制。
返回值1成功读入一行,0文件到了末尾,-1发生错误。
语法后不能有(),即不能使用getline()。
Getline读入新行后,将其复制给$0,并设置相关参数NFNRFNR
Getline<
“文件名”从文件中读入一行,文件名必须用“”,<
表示读入,与shell下<
作用一样。
“-”表示标准输入。
Getline+变量名,将读入的行赋值给变量,而不改变$0,对NF也没影响,但增加了计算器NF和FNR
|getline从前面的管道读入文件,
Close()函数关闭打开的文件或者管道,参数是文件名
System()函数,调用一个shell命令
输出可采用>
、>
>
重定向
Print|command输出到一个管道
约束
每个记录中的字段数100个,每个输入记录的字符数3000,每个输出记录的字符数3000,每个字段的字符个数1024,每个printf的字符个数3000,字面字符串中的字符个数400,字符类中中的字符个数400,打开的文件数15,打开的管道输1
在shell脚本中可是使用#!
语法调用awk,而可以不用引号包括awk代码
域
自动将输入行分隔成域。
域是一个或多个被分隔符分隔开的字符集,默认分隔符是空格或者tab。
(即分逻辑列)
域操作符$1
$0存储awk读入的行
awk‘$3<
75{printf“%s\t%s”,$0,“te”;
next;
}’
$3>
75{print$0;
}’+filename
复合表达式
支持&
、||!
Next跳过剩余的所有模式和表达式,读入下一行从第一个模式执行。
相当于continue
Nextfile跳出当前的处理文件而处理文件列表中的下一个文件
Exit使awk跳出。
但执行end中的动作
支持A?
B:
C
变量
Name=value
Value中可以包含
$0域值,支持变量名替换。
X=2;
$X等同于$2
特殊模式beginend
awk‘begin{action;
}
/pattern/{action;
/pattern/