Linux中的grep命令

leetcode中有几道关于命令行的问题,学习了一下

一、leetcode: 193. Valid Phone Numbers

Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bash script to print all valid phone numbers.

You may assume that a valid phone number must appear in one of the following two formats: (xxx) xxx-xxxx or xxx-xxx-xxxx. (x means a digit)

You may also assume each line in the text file must not contain leading or trailing white spaces.

For example, assume that file.txt has the following content:

1
2
3
987-123-4567
123 456 7890
(123) 456-7890

Your script should output the following valid phone numbers:

1
2
987-123-4567
(123) 456-7890

二、grep

grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

  • grep在数据中查找一个字符串时,是以“整行”为单位进行数据筛选的。
  • pattern如果是表达式或者超过两个单词的, 需要用引号引用. 可以是单引号也可双引号, 区别是单引号无法引用变量而双引号可以.

1、基本用法

1
grep [option] '搜索字符串' filename

常用选项:

  • c:只输出匹配行的计数。
  • I:不区分大小写(只适用于单字符)。
  • h:查询多文件时不显示文件名。
  • l:查询多文件时只输出包含匹配字符的文件名。
  • n:显示匹配行及行号。
  • s:不显示不存在或无匹配文本的错误信息。
  • v:显示不包含匹配文本的所有行。

pattern正则表达式主要参数:

  • \: 忽略正则表达式中特殊字符的原有含义。
  • ^:匹配正则表达式的开始行。
  • $: 匹配正则表达式的结束行。
  • \<:从匹配正则表达式的行开始。
  • \>:到匹配正则表达式的行结束。
  • :单个字符,如[A]即A符合要求 。
  • [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
  • .:所有的单个字符。
  • *:有字符,长度可以为0。

2、应用

grep ‘\<Tom>‘ file 包含单词Tom的行
grep ‘Tom savage’ file 包含Tom savage的行
grep ‘^Tommy’ file 包含以Tommy开头的行
grep ‘.bak$’ file 包含以.bak结束的行
grep ‘[Pp]yramid’ file 包含pyramid 或Pyramid的单词的行
grep ‘[A-Z]’ file 包含至少一个大写字母的行
grep ‘[0-9]’ file 包含至少一个数字的行
grep ‘[A-Z]…[0-9]’ file 包含五个字符,以大写开头, 和一个数字结尾的行.
grep -w ‘[tT]est’ file 包含单词和test的行.
grep -s ‘ken sun’ file 找到包含ken sun的行, 但不打印行, 而是用来检查退出状态.
grep -v aaa file 打印不包含aaa的行.
grep -i cathy file 打印所有包含cathy的行, 而不考虑大小些.
grep -l ‘dear cathy’ * 打印包含dear cathy的文件的文件名清单.
grep -n tom file 打印匹配的行并追加行号.
grep “$LOGNAME” file 包含变量内容的行, 注意必须用双引号, 单引号则无法引用变量.
grep ‘$name’ file 打印包含字符\$name的行.

3、leetcode答案

1
grep '^\(([0-9]\{3\}) \|[0-9]\{3\}-\)[0-9]\{3\}-[0-9]\{4\}$' file.txt

三、egrep

1、基本用法

egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式. 注意区别.

扩展表达式:

  • 匹配一个或者多个先前的字符, 至少一个先前字符.
  • ? 匹配0个或者多个先前字符.
  • a|b|c 匹配a或b或c
  • () 字符组, 如: love(able|ers) 匹配loveable或lovers.
  • (..)(..)\1\2 模板匹配. \1代表前面第一个模板, \2代第二个括弧里面的模板.
  • x{m,n} =x{m,n} x的字符数量在m到n个之间.

2、应用

egrep ‘^+’ file 以一个或者多个空格开头的行.
grep ‘^‘ file 同上
egrep ‘(TOM|DAN) SAVAGE’ file 包含 TOM SAVAGE 和DAN SAVAGE的行.
egrep ‘(ab)+’ file 包含至少一个ab的行.
egrep ‘x[0-9]?’ file 包含x或者x后面跟着0个或者多个数字的行.
egrep ‘fun.$’
所有文件里面以fun.结尾的行.
egrep ‘[A-Z]+’ file 至少包含一个大写字母的行.
egrep ‘[0-9]’ file 至少一个数字的行.
egrep ‘[A-Z]…[0-9]’ file 有五个字符, 第一个式大写, 最后一个是数字的行.
egrep ‘[tT]est’ file 包含单词test或Test的行.
egrep ‘ken sun’ file 包含ken sun的行.
egrep -v ‘marry’ file 不包含marry的行.
egrep -i ‘sam’ file 不考虑sam的大小写,含有sam的行.
egrep -l “dear ken” * 包含dear ken的所有文件的清单.
egrep -n tom file 包含tom的行, 每行前面追加行号.
egrep -s “$name” file 找到变量名\$name的, 不打印而是显示退出状态. 0表示找到. 1表示表达式没找到符合要求的, 2表示文件没找到.

3、leetcode答案

1
2
3
grep '^\(([0-9]\{3\}) \|[0-9]\{3\}-\)[0-9]\{3\}-[0-9]\{4\}$' file.txt
grep -E '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt
egrep '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt

两个都可以,可以看出和基本正则的区别。

http://www.cnblogs.com/end/archive/2012/02/21/2360965.html

http://blog.csdn.net/newthinker_wei/article/details/8219293