grep*与正则表达式

2016/05/05 Linux

前言

作为研究僧,私以为:搞研究大多数是以发论文作为成果,那论文如何写的高大上呢,当然是用一堆看不懂的符号来表示啦,别人越是看不懂,那就越显示咱的高水平,当然古人也是这样想的!╮(╯▽╰)╭ 这篇文章呢,就来讲一下:如何低调奢华地处理字符串。下面就从正则表达式和grep&sed&tr&awk命令2个方面来看日常的用法!

正则表达式:

概述

1956年, Stephen Kleene就用正则表达式来描述他的神经网络事件。全世界都觉得很高大上!一举成名,后来,Unix之父:肯·汤普逊又开发了 qed 编辑器,主要用在于字符串的处理。慢慢的正则表达式就变得接地气了,半小时速成是没问题哒!“小正”最常用于以下3种场景:

  • 1:匹配子串;
  • 2:替换子串;
  • 3:检测字符串格式。

另外呢,“小正”的移植性极佳,不论你是在windows上,还是在Linux上都可以使用,不光可以融入Python、Ruby等脚本语言,借助一些库函数,C/C++同样可以体验“小正”的强大魅力!可谓是,“小正”在手,查找无忧呀!

下面就详细讲讲“小正”的内容,本为以 /表达式/ 的形式来表示一个标准的正则表达式。

正则表达式字符集-普通字符

普通字符用于描述常规字符,可以直接匹配,(注意吆:“小正”的匹配是区分大小写的) 普通字符包含除元字符以外的ASCII表中的字符,包括字母、数字、标点符号、其他一些字符等。

举例:

/RegExp/ 可以从 字符串“Hellomy name is RegExp! 中匹配“RegExp

正则表达式字符集-限定符

限定符用于描述匹配的次数,一共有* + ? {n} {n,} {n,m}6种。他们之间可以进行一定的等效于转化。

{n}		只匹配重复n次的串
{n,}		匹配重复出现n+次的串
{n,m}		匹配重复出现n-m次的串
*		匹配任意0次或多个出现的串,等效于{0,}
+		匹配重复出现1次或多次的字符,等效于{1,}
?		匹配重复出现0次或一次的字符,等效于{0,1}

注意以上匹配只对限定符前面的一个单位有效,该单位可以为普通字符或元字符

举例: /zo/ 可以匹配出 zo、zoo、z; 但是不能匹配zozo! /[^0-9]/ 可以匹配除数字以外的任意字符!

正则表达式字符集-定位符

定位符用于描述匹配对应的位置,进行边界匹配,包括^ $ \b \B 4种:

^	匹配字符串开始或\n\r,注意:用在[^]中表示“非”的意思。
$	匹配字符串结束或\n\r
\b	匹配单词边界
\B	匹配非单词边界

举例:

/\bing*/可以匹配 `ingg`但是不能匹配 `amazing` !\B刚好相反。

正则表达式字符集-特殊字符和序列

特殊字符是一些元字符,如果引用自身可以使用\字符来表示 除了前面说的元字符外,还有

()	子表达式的开始与结束
.   \n以外的任意一个字符
\d	[0-9]
\D	[^0-9]
\s	[ \f\n\r\t\v]
\S	[^ \f\n\r\t\v] 
\t	字表符
\v	垂直制表符
\w	[A-Za-z0-9_]
\W	[^A-Za-z0-9_]
\xn	匹配n16进制字符,例如,'\x41' 匹配 "A" 	中文字符:GBK [\x80-\xff]
\num	匹配 正整数num
\un	匹配n一个16进制表示unicode字符 中文字符 UTF-8 [\u4E00-\u9FA5]
\nm	匹配8进制转义符

Linux下字符串匹配命令

grep 命令

grep 功能定位是搜索&截取 操作单位:行

使用格式:grep [选项] [模式] [file] 选项:

-n : 显示行号
-c : 输出行的数量
-I : 不区分大小写
-l : 输出文件名
-h : 不显示文件名
-r : 递归查询子目录下的文件
-v : 查找不包含文本的行

举例:

grep 'hello' *.txt 查找所有txt的文件
cat file>grep 'test' 查找在file文件中包含test的行
grep -n '[a-z]\{5}\' aa 查找至少有5个连续小写字母的串及行号

sed

sed 功能定位是匹配&增删改 操作单位:行

使用格式:sed [选项] [命令] [file]

sed是非交互式文本编辑器,适用于大文件的多种简单类型的编辑。sed处理时实际文件并没有被操作。除非使用-i选项,(不推荐使用!)

[常用选项]

  • -n 只打印编辑行
  • -e 多从命令,将下一个字符串解析为sed命令
  • -f 执行sed脚本
  • -i 直接原文编辑

[常用命令]

命令中的字符串可以使用正则表达式表示

a 新增, 下一行新增串 如:sed -n '/aa/a\bb\cc' file aa下一行插入bb cc两行。
c 取代, c 整行取代 如:cat file > sed -n "/734/c\Hello" 类似tr命令
d 删除, 删除固定的行 如:sed '1d' file 删除 file 里的第1
i 插入, 上一行插入字符串 如:sed -n '/ccc/i\ddd' file
p 打印, 选择打印, 如: sed -n '3p' file 只打印第3
s 取代, 类似vim中的替换, 如:sed 1,20s/old/new/g file
q 退出, 匹配到第1个终止匹配 如:sed -n '/^st/q' 
w file, 匹配到的行写入某文件如: sed -n '/m/w out' in in中读带m的行写到out

举例:

sed -n '1,1d' file 删除第1行,什么内容也不显示
sed '/test/d' file 删除带 test 的行
sed '1,5c ccccc' file  1-5行替换为ccccc
sed '/test/c ccccc' file  ccccc 替换所有带 test 的行

tr

tr 功能定位是删除&替换&去重 操作单位:文件

使用格式:tr [选项] [串1] [串2] [file]

-c 字符集补集替换(不太懂~
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串

举例:

将数字0-5替换为a-fcat file | tr [0-5] [a-f] 
删除文件file中出现的'a'b'c'字符:# cat file | tr -d "abc" 
删除文件file中出现的换行'\n'、制表'\t'字符:# cat file | tr -d "\n\t" 
删除连续重复字母,只保留第一个:# cat file | tr -s [a-zA-Z] 
删除空行 # cat file | tr -s "\n" > new_file

awk

awk 功能定位是分析&处理&格式化 操作单位:行

使用格式:awk '[条件1] [动作1] [条件2] [动作2]'

awk通常用于从具有一定结构的字符串中提取自己想要的信息,从而进行数据的筛选处理。awk语句定义了许多的内置变量,通过对内置变量的修改于访问,达到自己的要求。awk程序由一个主输入循环维持(代码一般被嵌到其中执行),主输入循环反复执行直到终止条件被触发。

内置变量:

BEGIN{}	主循环开始前执行{}中的内容
END{}	主循环结束后执行{}中的内容
FS 	分隔符,默认为空格,可以通过awk  -F'[:]'  awk '{FS=":"}' 修改
NF 	每一行分割后的字段数
NR 	当前处理到第几行 
$0 	代表整行数据
$n	n>=1代表分割后的第n区域,可以通过{print $n}的形式输出

逻辑运算: awk逻辑运算法则即字符与C语言基本相同。 运算符 > < >= <= == !== =

举例:

cat file | awk '{FS=":"} $3<10 {print $1 "\t" $3}'  :分割,输出$1$3并制表
cat file | awk 'BEGIN {FS=":"} {if($3==10 || $4==10) print $0}'  逻辑判断
cat file | awk /^$/{print "This is blank."}  匹配空行 
cat file | awk 'BEGIN {FS=","} {printf("%-15s\t%d\n", $1, $3)}' 格式化输出
cat file | awk 'BEGIN {FS=":";OFS=":"} gsub(/old/, "new", $1) {print $0}' 替换$1上的字符串'

awk 可以说具有完整的程序要素:变量、数组、循环…可以独立进行脚本程序设计,通过操作一些内置变量,实现需求。

调用方式:awk -f [awk脚本] [file] 比如一个简单的awk脚本:

#以 `,` 分割字符串,并对分割结果求平均
#!/bin/awk -f
BEGIN {FS=","}
{total=$4+$5+$6+$7+$8
avg=total/5
for(x=0;x<ARGC;x++)
print $1,avg,x
}

混合使用

grep/sed/tr/awk 对比

grep偏向于查找,轻量级,容易掌握,配合find命令,还可以批量文件名查询~ sed 倾向于“增删改”,引入了很多对字符串修改的操作。 tr 也是“删改”算是轻量级的sed,有木有觉得方便使用和记忆?└(^o^)┘ awk偏向于处理格式化的数据,对数据的进一步处理与显示~

命令与“小正”

这些命令在查找字符串时用到的“模式” 都是可以使用“小正”来表示的呀。 能够灵活运用“小正”们可以达到事半功倍的效果呢!

总结

好啦,本篇就写到这了,当上机试一下后,你就会感受到“小正”的强大魅力。半个小时学会应该没问题吧,但是要常常温故知新,才能灵活运用呀~

本篇的主要目的是方便温习,很多内容写得不够详细,如果看不懂可以看下面的推荐网站。妹子的话,我可以亲自辅导吆~ O(∩_∩)O 

推荐网站:

正则表达式教程

tr命令详解

grep&sed&awk专题1

grep&sed&awk专题2

Search

    Post Directory