正则表达式
^ 只只匹配行首
$ 只只匹配行尾
* 只一个单字符后紧跟*,匹配0个或多个此单字符
[ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用 -表示[ ]内字符序列范围,如用 [ 1 - 5 ]代替[ 1 2 3 4 5 ]
\ 只用来屏蔽一个元字符的特殊含义。因为有时在 s h e l l中一些元字符有特殊含义。 \可以使其失去应有意义
. 只匹配任意单字符
pattern\{n\} 用来匹配前面pattern出现次数。 n为次数
pattern\{n,\}m 含义同上,但次数最少为 n
pattern\{n,m\} 只含义同上,但 pattern出现次数在n与m之间
部分实例
空行 $
空行使用$来匹配
特殊字符
下列被认为是特殊字符
$ . ' " * [ ] ^ | ( ) \ + ?
这些符号都要使用\ 来进行转义
[]来匹配范围集合
使用“ -”表示一个字符串范围,表明字符串范围从“-”左边字符开始,到“ -”右边字符结束。
结合使用 *与[ ]更是有益,例如 [ A - Z a - Z ] *将匹配所有单词。
注意符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容。[a-z]
使用{}匹配模式结果出现的次数
pattern{n} 匹配模式出现n次。
pattern{n,} 匹配模式出现最少n次。
pattern{n,m} 匹配模式出现n到m次之间, n , m为0 - 2 5 5中任意整数。
The
grep 家族
grep
g r e p一般格式为:
grep [选项]基本正则表达式[文件]
这里基本正则表达式可为字符串。
双引号
在grep命令中输入字符串参数时,最好将其用双引号括起来。
一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串
grep选项
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
精确匹配
使用grep抽取精确匹配的一种更有效方式是在抽取字符串后加 >。
使用grep匹配“与”或者“或”模式
g r e p命令加 - E参数,这一扩展允许使用扩展模式匹配。
awk
如果要格式化报文或从一个大的文本文件中抽取数据包,那么 a w k可以完成这些任务
命令格式
awk [-F field-separator ] 'commands' input-files
[ - F域分隔符]是可选的,因为 a w k使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项
awk -f awk-script-files input-files
-f选项指明在文件 a w k _ s c r i p t _ f i l e中的a w k脚本, i n p u t _ f i l e ( s )是使用a w k进行浏览的文件名。
脚本执行流程
如果设置了 - F选项,则a w k每次读一条记录或一行,并使用指定的分隔符分隔指定域,但如果未设置- F选项, a w k假定空格为域分隔符,并保持这个设置直到发现一新行。当新行出现时, a w k命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件尾或文件不再存在。
模式和动作
任何awk语句都由模式和动作组成。在一个 awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。
实际动作在大括号 { }内指明。动作大多数用来打印,但是还有些更长的代码诸如 i f和循环(looping)语句及循环退出结构。如果不指明采取动作, awk将打印出所有浏览出来的记录。
域和记录
awk执行时,其浏览域标记为 \(1,\)2...$n。这种方法称为域标识。
使用 $0,意即所有域。
为打印一个域或所有域,使用 p r i n t命令。这是一个a w k动作(动作语法用圆括号括起来)。
打印头
打印信息头放置在 B E G I N模式部分,因为打印信息头被界定为一个动作,必须用大括号括起来。
如果在末行加入end of report信息,可使用E N D语句。 E N D语句在所有文本处理动作执行完之后才被执行。 E N D语句在脚本中的位置放置在主要动作之后。
awk 'BEGIN { print "name belt....."} { print \(1 "/t" \)4} END {"end of report"}
awk错误提示
• 确保整个a w k命令用单引号括起来。
• 确保命令内所有引号成对出现。
• 确保用花括号括起动作语句,用圆括号括起条件语句。
• 可能忘记使用花括号,也许你认为没有必要,但 a w k不这样认为,将按之解释语法。
awk正则表达式
awk中同样也可以使用正则表达式
awk支持的正则
\ ^ $ . [ ] | ( ) * + ?
匹配
使用~后跟正则表达式来匹配
表达式{if($4~_brown_) print }
精确匹配
为精确匹配 4 8,使用等号 = =,并用单引号括起条件。例如 $ 3 = =“ 4 8”,
不匹配
有时要浏览信息并抽取不匹配操作的记录,与 ~相反的符号是 !~,意即不匹配。
小于
小于等于
大于
大小写
为查询大小写信息,可使用 [ ]符号。
任意字符
或关系匹配
行首
AND
OR
awk内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 - F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符t
awk操作符
在a w k中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。一般的变量名设置方式为 n a m e = \( n,这里n a m e为调用的域变量名, n为实际域号。例如设置学生域名为n a m e,级别域名为 b e l t,操作为n a m e = \) 1 ; b e l t s = $ 4
阈值比较操作
有两种方式测试一数值域是否小于另一数值域。
1) 在B E G I N中给变量名赋值。
2) 在关系操作中使用实际数值
修改数值域取值
当在a w k中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的a w k复本。 a w k会在变量N R或N F变量中反映出修改痕迹。
修改文本域
修改文本域即对其重新赋值。需要做的就是赋给一个新的字符串
只显示修改部分
在模式后面使用花括号将只打印修改部分
创建新域
在a w k中处理数据时,基于各域进行计算时创建新域是一种好习惯。创建新域要通过其他域赋予新域标识符。如创建一个基于其他域的加法新域 { \( 4 = \) 2 + $ 3 },这里假定记录包含3个域,则域4为新建域,保存域2和域3相加结果。
当然可以创建新域,并赋给其更有意义的变量名
增加列值
为增加列数或进行运行结果统计,使用符号 + =。增加的结果赋给符号左边变量值,增加到变量的域在符号右边。
内置的字符串函数
gsub(r, s) 在整个\( 0中用s替代r
g s u b ( r, s , t ) 在整个t中用s替代r
i n d e x ( s , t ) 返回s中字符串t的第一位置
l e n g t h ( s ) 返回s长度
m a t c h ( s , r ) 测试s是否包含匹配 r的字符串
s p l i t ( s , a , f s ) 在f s上将s分成序列a
s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p
s u b ( r, s ) 用\) 0中最左边最长的子串代替 s
s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分
s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分
字符串屏蔽序列
\ b 退格键
\ t t a b键
\ f 走纸换页
\ d d d 八进制值
\ n 新行
\ c 任意其他特殊字符,例如 \ \为反斜线符号
\ r 回车键
awk输出函数printf
p r i n t f函数基本语法是p r i n t f( [格式控制符 ],参数),格式控制字符通常在引号里。
awk printf修饰符
-左对齐
Width 域的步长,用 0表示0步长
.prec 最大字符串长度,或小数点右边的位数
awk printf 格式
% c A S C I I字符
% d 整数
% e 浮点数,科学记数法
% f 浮点数,例如( 1 2 3 . 4 4)
% g a w k决定使用哪种浮点数转换 e或者f
% o 八进制数
% s 字符串
% x 十六进制数