grep 正则表达式

时间:2020-01-09 10:38:47  来源:igfitidea点击:

如何在Linux或者Unix中从文件中grep完全匹配字符串或者模式。
如何搜索确切的模式。
如何使用示例进行grep精确匹配?

以下是我的示例文件,

# cat /tmp/somefile
first line ABCD some text
second line abcd some text
third line12abcde some text
fourth line 12.abcd.32 some text
fifth line s(abcd)e some text
sixth line 1234abcd some text
seventh line 1abcd234 some text
eighth line 234abcd1 some text
abcd some text
abcd

grep与-w完全匹配

现在使用grep,我们有一个参数(-w),用于对文件中的整个单词进行精确匹配的grep。

# grep -w abcd /tmp/somefile
second line abcd some text
fourth line 12.abcd.32 some text
fifth line s(abcd)e some text
abcd some text
abcd

如我们所见,尽管grep并非100%成功,但它确实通过删除不相关的匹配对输出进行了过滤。
在grep的手册页中:

-w, --word-regexp
     Select  only  those  lines  containing  matches  that  form  whole  words.  The test is that the matching
     substring must either be at the beginning of the line, or preceded by a non-word  constituent  character.
     Similarly,  it  must  be  either  at the end of the line or followed by a non-word constituent character.
     Word-constituent characters are letters, digits, and the underscore.

方法1:第一个和最后一个字符的grep

我们可以通过放置开始(^)和结束($)char的正则表达式来grep精确匹配。
由于我们计划为abcd使用grep,因此命令将是:

# grep -E "^abcd$" /tmp/somefile
abcd
  • 但是,如果我们观察到,此命令将无法捕获其他包含abcd的行。

  • 我们必须了解,当我们定义正则表达式以查找开始(^)和结束($)字符时,它表示整行中的第一个和最后一个字符。

  • 由于只有这样一种情况,行以a开头,以d结束,所以只有一个输出。

  • 如果我们必须在行的中间找到任何内容,则此"行不通"。

如果字符串在开头,那么我们可以使用((^)`

# grep -E "^abcd" /tmp/somefile
abcd some text
abcd

方法2:使用空格字符匹配文本

我们只能搜索前导或者尾随空格字符的完全匹配,因此我们知道这是完全匹配

# grep -E "(^| )abcd( |$)" /tmp/somefile
second line abcd some text
abcd some text
abcd

这为我们提供了与abcd完全匹配的所有行的完美输出。
或者使用\ s代替`()空白

# grep -E "(^|\s)abcd(\s|$)" /tmp/somefile
second line abcd some text
abcd some text
abcd

方法3:匹配单词的开头和结尾

使用grep扩展的正则表达式,我们可以匹配单词的开头和结尾

# grep -E "\babcd(\s|$)" /tmp/somefile
second line abcd some text
abcd some text
abcd

这里的(\ s | $)是指以空格结尾或者行尾,而/b被视为单词边界,它与单词边缘的空字符串匹配。
我们可能还使用过:

# grep -E "(\s|^)abcd(\s|$)" /tmp/somefile
second line abcd some text
abcd some text
abcd

或者在文字末尾加上\ b时,使用/s +来匹配一个或者多个空格字符。

# grep -E "(^|\s+)abcd\b" /tmp/somefile
second line abcd some text
abcd some text
abcd

方法4:与字符串中的数字匹配

现在,我们将尝试打印所有具有1234abcd的行。
这里我们的字符串包含整数,现在假设我们不知道可以存在的整数值,我们都知道在abcd的开头有一些整数

# grep -E "[0-9]+abcd( |$)" /tmp/somefile
sixth line 1234abcd some text

这里的[0-9] +将匹配一个或者多个整数,后跟abcd,而(| $)将确保该字符串位于该行的末尾,且末尾有一个空格字符