Linux 文本过滤

2016/12/28 posted in  linux

正则表达式

^ 只只匹配行首
$ 只只匹配行尾
* 只一个单字符后紧跟*,匹配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 十六进制数