
gsub(r,s)在整个$ 0中用r替换r; gsub(r,s,t)在整个t时间内用s替换r
gsub功能有点类似于sed搜索和替换. 它允许将一个字符串或字符替换为另一字符串或字符,并以正则表达式的形式执行它. 第一个函数作用于记录$ 0,第二个gsub函数允许指定目标,但是,如果未指定目标,则默认值为$ 0.
index(s,t): 该函数返回查询字符串t在目标字符串s中的第一个位置.
length(s): 返回s的长度
match(s,r): 测试s是否包含与r匹配的字符串
split(s,a,fs)将s分成fs上的序列a
sprint(fmt,exp): 该函数类似于printf函数(稍后涉及),并以基本输出格式fmt返回结果字符串exp.
sub(r,s)用$ 0中最最长的子字符串替换s
substr(s,p)返回字符串s中从p开始的后缀部分
substr(s,p,n)返回字符串s的后缀部分,其长度n从p开始.
match函数测试字符串s是否包含由正则表达式r定义的匹配项.
Split使用字段分隔符fs将字符串s划分为指定的序列a.
1.gsub
要在整个记录中用另一个字符串替换一个字符串,请使用正则表达式格式/目标模式/替换模式/. 例如,将学生序列号4842更改为4899:
$ cat grade.txt
M. 棕褐色5/99 48311绿色8 40 44
J.Lulu 06/99 48317绿色9 24 26
P. 兔子02/99 4812 35 28
J.Troll 07/99 4842布朗3 12 26 26
L. Tansl 05/99 4712棕色2 12 30 28
#cd / usr / sam
#awk'gsub(/ 4842 /,4899){print $ 0}'grade.txt
J.Troll 07/99 4899布朗3 12 26 26
2. 索引
t在查询字符串s中出现的第一个位置. 该字符串必须用双引号引起来. 例如,它返回ny在目标字符串Bunny中出现的第一个位置,即字符数.
#awk'BEGIN {打印索引(“ Bunny”,“ ny”)}'grade.txt
4
3. 长度
返回所需的字符串长度,例如,检查字符串J.Troll返回名称及其长度,即由该人的姓名组成的字符数
#awk'$ 1 ==“ J.Troll” {打印长度($ 1)“” $ 1}'grade.txt
7 J.Troll
还有另一种方法,这里是双引号.
#awk'开始{打印长度(“好男人”)}'

14
4. 匹配
match测试目标字符串是否包含搜索字符的一部分. 您可以对搜索部分使用正则表达式,并且返回值是成功排列的字符数组的数量. 如果未找到,则返回0. 第一个示例在ANCD中查找d. 因为它不存在,所以它返回0. 第二个示例在ANCD中查找D. 由于它的存在,它返回D在ANCD中出现的第一个位置的字符数. 第三个示例在学生J.Lulu中寻找u.
#awk'开始{打印匹配(“ ANCD”,/ d /)}'
#awk'开始{打印匹配(“ ANCD”,/ D /)}'
4
#awk'$ 1 ==“ J.Lulu” {打印匹配($ 1,“ u”)}'grade.txt
4
5. 分裂
使用split返回字符串数组元素的数量. 工作方法如下: 如果存在包含指定分隔符的字符串(例如AD2-KP9-JU2-LP-1),则将其分成一个数组. 使用split指定定界符和数组名称. 在此示例中,命令格式为(“ AD2-KP9-JU2-LP-1”,parts_array,“-”),先拆分然后返回数组下标的数量,结果为4.
#awk'BEGIN {打印拆分(“ 123-456-789”,pats_array,“-”)}'
3
另一个示例使用了不同的定界符.
#awk'开始{打印拆分(“ 123#456#789”,myarray,“#”)}'
3
在此示例中,split返回数组myarray中的下标数目. 数组myarray的值如下:
myarray [1] = 123
myarray [2] = 456
myarray [3] = 789
6. 子
使用sub查找并替换第一次出现的模式. 字符串STR包含“ poped popo pill”,执行以下子命令sub(/ op /awk 替换,“ OP”,STR). 当图案op首次出现时,将执行替换操作,返回结果如下: “ pOPed pope pill”.
例如,学生J.Troll的记录具有两个值: “当前成绩点”和“最高成绩点”. 仅第一个更改为29,第二个仍为26,操作命令为sub(/ 26 /,“ 29”,$ 0),并且仅出现第一个26. 请注意,J.Troll记录需要存在.
#awk'$ 1 ==“ J.Troll”子(/ 26 /,“ 29”,$ 0)'grade.txt
M. 棕褐色5/99 48311绿色8 40 44
J.Lulu 06/99 48317绿色9 24 29
P. 兔子02/99 4812 35 28
J.Troll 07/99 4842布朗3 12 29 26
L. Tansl 05/99 4712棕色2 12 30 28
7. substr
substr是一个非常有用的功能. 它根据起始位置和长度返回字符串的一部分. 示例如下:
#awk'$ 1 ==“ L.Tansl” {print substr($ 1,1,3)}'grade.txt
L.T
在上面的示例中,指定域1中的第一个字符并返回前3个字符.
如果给定的长度值比字符串的长度大得多,awk将从起始位置返回所有字符. 要提取Ltansl-ey的姓氏,只需从第三个字符返回长度7. 您可以输入99的长度,而awk会返回相同的结果.

#awk'$ 1 ==“ L.Tansl” {print substr($ 1,1,99)}'grade.txt
L.Tansl
substr的另一种形式是返回字符串后缀或指定位置之后的字符. 在这里,您需要提供指定的字符串以及返回的字符串的起始位置. 例如,要从文本文件中提取姓氏,您需要操作域1awk 替换,并以第三个字符开头:
#awk'{print substr($ 1,3)}'grade.txt
谭
卢卢
兔子
巨魔 p>
Tansl
另一个示例是在BEGIN部分中定义一个字符串,并返回从END部分中的第t个字符中提取的子字符串.
#awk'开始{STR =“一个好人”} END {打印substr(STR,7)}'grade.txt
好男人
8. 将字符串从外壳传递到awk
Awk脚本大多只是一行,并且很少用字符串表示. 它们中的大多数都要求awk脚本在一行中完成,这很容易通过将变量传递给awk命令行来完成. 现在列举一些有关其基本原理的例子.
使用管道将备用字符串传递给awk并返回其长度.
#echo“ Stand-by” | awk'{打印长度($ 0)}'
8
将文件名设置为变量,将输出通过管道传输到awk,然后返回不带扩展名的文件名.
#STR =“ mydoc.txt”
#echo $ STR | awk'{print substr($ STR,1,5)}'
mydoc
将文件名设置为变量,并将输出通过管道传输到awk,仅返回其扩展名.
#STR =“ mydoc.txt”
#echo $ STR | awk'{print substr($ STR,7)}'
txt
字符串屏蔽顺序
在使用字符串或正则表达式时,有时需要在输出中添加换行或查询一元字符. 在打印新行(新行字符\ n)时,请给出其屏蔽顺序,以免失去其特殊含义. 用法是在字符串之前添加反斜杠. 例如,使用\ n强制打印新行.
如果使用正则表达式,请查询花括号({}),并在字符之前添加反斜杠,例如/ \ {/,这将在awk中失去其特殊含义.
awk中使用的封锁顺序
\ b退格键
\ t Tab键
\ f进纸更改
\ ddd八进制值
\ n换行

\ c其他任何特殊字符,例如\ \是反斜杠符号
\ r输入密钥
使用上述符号,打印“”,在中间按Tab键,然后再显示两行,然后打印“”,但这一次使用八进制数104、141和171表示D,a和y,分别.
#awk'开始{打印“ \ nMay \ tDay \ n \ nMay \ t \ 104 \ 141 \ 171”}'
请注意,\ 104是D的八进制ASCII码,\ 141是a的八进制ASCII码,依此类推.
awk输出功能printf
到目前为止,所有示例的输出都直接输出到屏幕上,除tab键外没有其他格式. awk提供了函数printf,它具有几个不同的格式化输出函数. 例如,按列输出,左对齐或右对齐.
每个printf函数(格式控制字符)以%符号开头,并以确定转换的字符结尾. 转换包含三个修饰符.
printf函数的基本语法为printf([格式控制字符],参数),并且格式控制字符通常用引号引起来.
printf修饰符
-左对齐
“宽度”字段的步长,0代表0步长
.prec最大字符串长度,或小数点右边的位数
awk printf格式
%c个ASCII字符
%d整数
%e浮点数,科学计数法
%f浮点数,例如(1 2 3. 4 4)
%g awk决定使用哪个浮点数转换e或f
%o八进制数
%s字符串
%x十六进制数
1. 字符转换
观察ASCII码中65的等效值. 流水线将65输出到awk. printf执行ASCII字符转换. 在此还添加了换行符,因为printf默认情况下不做换行符.
$ echo“ 65” | awk'{printf“%c \ n”,$ 0}'
A
以相同的方式使用awk可获得相同的结果.
$ awk'BEGIN {printf“%c \ n”,65}'
A
所有字符转换都相同. 以下示例显示了浮点转换后的输出“ 999”. 传递整数后,将添加六个小数点.
$ awk'BEGIN {printf“%f \ n”,999}'
999.000000

2. 格式化输出
打印所有学生姓名和序列号,要求姓名左对齐,长15个字符,后跟序列号. 注意\ n换行符位于最后一个指示符之后. 输出将自动分为两列.
#awk'{printf“%-15s%s \ n”,$ 1,$ 3}'grade.txt
M.Tans 48311
J.Lulu 48317
P.Bunny 48
J.Troll 4842
L. Tansl 4712
添加一些文本注释以帮助理解消息的含义. 您可以在文本之前嵌入标题信息. 请注意,使用print添加标题信息. 如果需要,也可以使用printf.
#awk'开始{print“ Name \ t \ tS.Number”} {printf“%-15s%s \ n”,$ 1,$ 3}'grade.txt
姓名S.Number
M.Tans 48311
J.Lulu 48317
P.Bunny 48
J.Troll 4842
L. Tansl 4712
打印输出“您叫什么名字?”如果第一个字段与employees2中的记录匹配,则使用getline函数从终端接收输入并将其发送到name变量,直到用户输入Enter.
打印“找到”,名称变量,“”,行号.
打印“ See ya”,名称变量
以上是雇员2中传递到名称变量的值的情况
$ awk'BEGIN {printf“你叫什么名字?”; \
getline名称<“ / dev / tty”} \
$ 1〜名称{print“ Found”名称“”,NR“. ”} \
END {打印“再见,”,名称为“. ”}'employees2
你叫什么名字?汤姆
在第1行找到了汤姆.
汤姆,再见.
员工不存在的情况2
$ awk'BEGIN {printf“你叫什么名字?”; \
getline名称<“ / dev / tty”} \
$ 1〜名称{print“ Found”名称“”,NR“. ”} \
END {打印“再见,”,名称为“. ”}'employees2
你叫什么名字? czm
再见,czm.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-164136-1.html
特意造了几个合格品去送检
导弹艇也要严阵以待
大喊被美国人欺负了