sedawk手册.docx
- 文档编号:17193799
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:21
- 大小:27.27KB
sedawk手册.docx
《sedawk手册.docx》由会员分享,可在线阅读,更多相关《sedawk手册.docx(21页珍藏版)》请在冰豆网上搜索。
sedawk手册
目录
Sed1
sed常用选择项1
语法正则表达式1
替换5
删除5
追加插入更改5
列表6
转换6
打印6
打印行号6
下一步6
读和写文件7
退出7
高级命令7
awk12
分隔符12
表达式字符链接12
系统内置变量13
格式化输出15
使用shell变量15
流控制16
数组17
测试数组成员19
函数20
高级讲解22
域22
变量23
特殊模式beginend23
命令参数24
Sed
sed常用选择项
sed/awk+[参数选项]+“语法“+文件名
-n关闭输出到标准输出
-e执行多条sed命令;(或者用“;”间隔多条指令)
-f从命令脚本读如命令
Sed–fsed_srcript_fileinput_file
sed/awk的特点
均是读入文件的一行做为输入,应用于所有的命令,再读入下一行
执行操作:
1从输入文件中读入一行
2为改行做一个拷贝
3在该行上执行“语法”动作
4为下一行执行第一步动作
语法正则表达式
/pattern/action
Pattern正则表达式
Action执行动作
执行过程:
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}
跳过文本当前行,读入下一行
sed-n'/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常用选择项
sed/awk+[参数选项]+“语法“+文件名
-e执行多条awk命令;(或者用“;”间隔多条指令)
-f从命令脚本读如命令
-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/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sedawk 手册