一:使用grep、sed、cut、awk文本处理命令解决实际问题。
Bash Shell提供了功能强大的文件处理工具:
sed(流编辑器stream editor)和awk,都可使用正则表达式进行模式匹配。而grep又有助于理解sed和awk。
通配符
1.1 学习和使用grep
grep是Linux中使用最广泛的命令之一。grep(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式,grep打印包含模式的所有行。grep支持基本正则表达式,也支持其扩展集。
本节主要讨论以下内容:
• grep(参数)选项。
• 匹配grep的一般模式。
• 只匹配字母或数字,或两者混用。
• 匹配字符串范围。
1.1.1 grep 一般格式为:
grep “选项”基本正则表达式“文件”
1.1.2 双引号的使用
在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:“mystring”。这样做有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串,
例如:“jetplane”,如果不用双引号将其括起来,那么单词plane将被误认为是一个文件,查询结果
将返回“文件不存在”的错误信息。在调用变量时,也应该使用双引号,诸如:grep“$MYVAR”文件名,如果不这样,将没有返回结果。
在调用模式匹配时,应使用单引号。
1.1.3 grep选项
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
1.1.4 . grep举例
(1) 多文件查找
[root@localhost sh]# grep "48" *.sh
或在所有文件中查询单词“ sort it”
[root@localhost sh]# grep "48" *
666.sh:48
666.sh:48
666.sh:48
777.sh:48
777.sh:48
[root@localhost sh]# grep -c "48" 777.sh
2
[root@localhost sh]#
grep返回数字2,意义是有2行包含字符串“48”
(2)显示满足匹配模式的所有行行数
[root@localhost sh]# grep -n "48" 777.sh
1:48
2:48
(3)显示不匹配的行
[root@localhost sh]# grep -v "48" 777.sh
(4)大小写敏感
grep -i "g" 777.sh
1.2 正则表达式
(1)模式匹配
假定要抽取代码为484到486的城市位置,可以使用[ ]来指定字符串范围,这里用48开始,以4或6结尾,这样抽出483或484或486
[root@localhost sh]# grep "48[4-6]" 777.sh
484
485
486
不匹配行首 如果要抽出记录,使其行首不是48,可以在方括号中使用^记号,表明查询在行首开始。
grep '^[48]' 777.sh
48
48
43
4
4
484
485
486
(2)匹配任意字符
如果抽取以K开头,以D结尾的所有代码,可使用下述方法,因为已知代码长度为5个字符:
grep 'K...D' 777.sh
Kui5D
Kg4yD
# ... 代表有三位加上K和D是五位
(3)日期查询
一个常用的查询模式是日期查询。先查询所有以5开始以1996或1998结尾的所有记录。使用模式5…199[6,8]。这意味着第一个字符为5,后跟两个点,接着是199,剩余两个数字是6或8。
[root@bogon z3]# grep '5..199[68]' data.f
483 Sept 5AP1996 USP 65.00 LVX2C 189
483 may 5PA1998 USP 37.00 KVM9D 644
(4)模式出现机率
抽取包含数字4至少重复出现两次的所有行,方法如下:
[root@bogon z3]# grep '4/{2/}' data.f
483 may 5PA1998 USP 37.00 KVM9D 644
使用grep匹配“与”或者“或”模式
[root@localhost sh]# grep -E '4|48' 777.sh
48
48
43
4
4
484
485
486
Kg4yD
4
444
4
2.3 类名
类等价的正则表达式类等价的正则表达式
[[:upper:]] [A-Z]
[[:lower:]] [a-z]
[[:alnum:]] [0-9a-zA-Z]
[[:space:]] 空格或tab键
[[:digit:]] [0-9]
[[:alpha:]] [a-zA-Z]
如果要通过文件快速查找字符串或模式, grep是一个很好的选择。简单地说, grep是shell编程中很重要的工具。