Linux-grep的详细使用

目录

  • grep
    • 常见选项
      • grep -v 选项
      • -v和`[^..]`的区别
    • 常见使用方法
    • 正则表达式
      • 介绍
      • BRE和ERE
      • 使用
    • 总结

grep

在 Shell 中,grep 命令是一种用于在文件中查找指定字符串的强大工具。grep 命令的基本语法如下:

grep [OPTIONS] PATTERN [FILE...]

其中,OPTIONS 表示命令选项,PATTERN 表示要查找的字符串模式,FILE 表示要查找的文件名。如果没有指定文件名,则 grep 命令将从标准输入中读取数据。

下面是一些常见的 grep 命令的选项和用法:

常见选项

  • -i:忽略大小写
  • -v:反向匹配,只输出不匹配的行
  • -w:只匹配整个单词,而不是单词的一部分
  • -n:在每行输出匹配的行号
  • -c:仅输出匹配的行数
  • -l:只输出包含匹配项的文件名
  • -r:递归搜索指定目录下的所有文件
  • -E:使用扩展正则表达式语法
  • -F:将模式视为固定字符串而不是正则表达式
  • -o 是一个非常有用的命令选项,用于在匹配文本中仅输出匹配的部分,而不是整个行或文件。
  • -A 表示显示匹配行的后 num 行文本
  • -B 表示显示匹配行的前 num 行文本
  • -C 表示显示匹配行前后 num 行文本

grep -v 选项

-v 选项是 grep 命令的一个选项,用于查找不包含指定模式的文本行。例如,如果我们要从文件 file.txt 中查找不包含字符串 “error” 的文本行,我们可以运行以下命令:

grep -v "[0-9]" file.txt
-------------------------------------
[root@localhost 5-8]# grep -v "[0-9]" file.txt
dasdas

此命令将返回不包含字符串 "[0-9]"的所有文本行。

[^0-9] 正则表达式

[^0-9] 是一个正则表达式模式,它用于匹配不包含数字的文本。在这个模式中,^ 符号表示 “非”。因此,[^0-9] 表示匹配不是数字的字符。例如,如果我们要从文件 file.txt 中查找不包含数字的文本行,我们可以运行以下命令:

grep -E '^[^0-9]+$' file.txt
-------------------------------------------
[root@localhost 5-8]# grep  "[^0-9]" file.txt
dasdas  12321
dasdas

此命令将使用 -E 选项来启用扩展正则表达式,从而匹配所有不包含数字的行。

可以在此基础上接-o,可以输出仅配备的行

[root@localhost 5-8]# grep  -o "[^0-9]" file.txt
-------------------------------------------------------------
dasdas

dasdas

-v和[^..]的区别

grep 命令中,-v 选项和 [^0-9] 正则表达式都用于搜索与给定模式不匹配的文本行。下面是这两种方法的详细介绍和使用示例。

定义file.txt文件,数据如下:

[root@localhost 5-8]# cat file.txt 
dasdas  12321
2131
  • -v 选项用于查找不包含给定模式的文本行,而 [^0-9] 正则表达式用于查找不包含数字的文本行
  • -v 选项是 grep 命令的一个选项,而 [^0-9] 是一个正则表达式模式。
  • -v 选项可以与其他选项一起使用,例如 -i-w-r,而 [^0-9] 只能在正则表达式中使用。

总之,-v 选项用于查找不包含给定模式的文本行,而 [^0-9] 正则表达式用于查找不包含数字的文本行。它们可以在不同的情况下使用,具体取决于您的需求和搜索条件。

常见使用方法

  • 查找文件中包含指定字符串的行:

    grep 'pattern' file.txt
    

    这条命令将在 file.txt 文件中查找包含 “pattern” 字符串的行,并将结果输出到标准输出中。

  • 查找多个文件中包含指定字符串的行:

    grep 'pattern' file1.txt file2.txt file3.txt
    

    这条命令将在 file1.txt、file2.txt 和 file3.txt 文件中查找包含 “pattern” 字符串的行,并将结果输出到标准输出中。

  • 查找目录中所有文件中包含指定字符串的行:

    grep -r 'pattern' /path/to/directory
    

    这条命令将递归地查找 /path/to/directory 目录及其子目录中所有文件中包含 “pattern” 字符串的行,并将结果输出到标准输出中。

  • 忽略大小写,查找文件中包含指定字符串的行:

    grep -i 'pattern' file.txt
    

    这条命令将在 file.txt 文件中查找包含 “pattern” 字符串(忽略大小写)的行,并将结果输出到标准输出中。

  • 反转查找结果,查找文件中不包含指定字符串的行:

    grep -v 'pattern' file.txt
    

    这条命令将在 file.txt 文件中查找不包含 “pattern” 字符串的行,并将结果输出到标准输出中。

  • 只输出匹配模式的行数:

    grep -c 'pattern' file.txt
    

    这条命令将在 file.txt 文件中查找包含 “pattern” 字符串的行数,并将结果输出到标准输出中。

  • 显示匹配行前后的文本

    假设我们有一个名为 file.txt 的文本文件,其中包含一些文本行。我们可以使用 grep 命令来查找文件中包含字符串 pattern 的行,并在每个匹配行的前后显示 2 行文本,例如:

    grep -C 2 'pattern' file.txt
    
  • 仅显示匹配行后的文本

    假设我们有一个名为 numbers.txt 的文本文件,其中包含一些数字。我们可以使用 grep 命令来查找文件中包含数字 123 的行,并在每个匹配行后显示 3 行文本,例如:

    grep -A 3 '123' numbers.txt
    
  • 仅显示匹配行前的文本

    假设我们有一个名为 urls.txt 的文本文件,其中包含一些 URL。我们可以使用 grep 命令来查找文件中包含字符串 http 的行,并在每个匹配行前显示 1 行文本,例如:

    grep -B 1 'http' urls.txt
    

    注意事项

    • 为了避免与正则表达式中的特殊字符冲突,必须将模式括在引号中。
    • 如果上下文行的数量太多,输出可能会变得很混

正则表达式

介绍

在Shell中,正则表达式是一种字符串模式匹配工具,用于在文本中查找和处理特定的字符串。Shell中支持两种类型的正则表达式:基本正则表达式(Basic Regular Expressions,BRE)和扩展正则表达式(Extended Regular Expressions,ERE)。

正则表达式通常包含普通字符和特殊字符两种类型。普通字符是指除了特殊字符以外的字符,特殊字符则是一些特殊含义的字符,用于表示一些特定的字符集或字符序列。以下是一些常见的正则表达式特殊字符。

BRE和ERE

在Shell中,有两种常用的正则表达式:基本正则表达式和扩展正则表达式。它们的区别在于支持的元字符和特殊语法的不同。下面分别介绍它们的特点和用法。

基本正则表达式

基本正则表达式(BRE)是最早的正则表达式语法,支持的元字符比较少,但功能足够强大。在BRE中,一些特殊字符必须进行转义才能作为元字符使用,如*+?等。

以下是一些BRE中常用的元字符和特殊语法:

  • .:匹配任意单个字符
  • []:匹配一个字符集中的任意一个字符
  • [^]:匹配一个不在字符集中的字符
  • \:转义字符
  • ^:匹配行首,代表以什么开头
  • $:匹配行尾,代表以什么结尾的行
  • ():分组
  • *:匹配前一个字符的零个或多个
  • \{n\}:匹配前一个字符的n个
  • \{n,\}:匹配前一个字符的至少n个
  • \{n,m\}:匹配前一个字符的n到m个

例如,BRE表达式^[a-zA-Z]*$将匹配只包含字母的行。^$代表空行,.*代表所有的字符(任意字符)

在Shell中,使用grep命令可以使用BRE。默认情况下,grep使用的就是BRE。

扩展正则表达式

扩展正则表达式(ERE)是BRE的扩展,支持的元字符更多,也更易用。在ERE中,特殊字符不需要转义即可作为元字符使用。

以下是一些ERE中常用的元字符和特殊语法:

  • .:匹配任意单个字符
  • []:匹配一个字符集中的任意一个字符
  • [^]:匹配一个不在字符集中的字符
  • ():分组
  • |:或
  • *:匹配前一个字符的零个或多个
  • +:匹配前一个字符的一个或多个
  • ?:匹配前一个字符的零个或一个
  • {n}:匹配前一个字符的n个
  • {n,}:匹配前一个字符的至少n个
  • {n,m}:匹配前一个字符的n到m个
  • \<(\b):表示词首部以什么开头
  • \>(\b):表示词尾部以什么结束
  • \\表示abc这个单词

例如,ERE表达式^[a-zA-Z]*$和BRE表达式是等价的。

在Shell中,可以使用grep命令的-E选项来启用ERE模式。例如,grep -E '^[a-zA-Z]*$' file.txt将使用ERE模式匹配file.txt中只包含字母的行。

除了grep命令之外,还有一些其他的Shell命令,如sed和awk也支持ERE。

使用

下面是一些常见的正则表达式用法及示例:

  • 匹配以 xiao 开头的单词

    [root@localhost ~]# echo "xiaohua lihua yangyang"|egrep "\bxiao" -o
    

    [root@localhost ~]# echo "xiaohua lihua yangyang"|egrep "\
  • 匹配以 hua 结尾的行

    [root@localhost ~]# echo "xiaohua lihua yangyang"|egrep "hua\>" -o
    

    [root@localhost ~]# echo "xiaohua lihua yangyang"|egrep "hua\b" -o
    
  • 匹配以 hello 开头的行:

    grep '^hello' file.txt
    
  • 匹配以 world 结尾的行:

    grep 'world$' file.txt
    
  • 匹配包含 hello 的行:

    grep 'hello' file.txt
    
  • 匹配包含 helloworld 的行:

    grep 'hello\|world' file.txt
    
  • 匹配以字母 a 开头,后跟任意字符,再后跟字母 z 结尾的行:

    grep '^a.*z$' file.txt
    
  • 匹配以字母 a 开头,后跟一个或多个字母 b,再后跟字母 c 结尾的行:

    grep '^a\+b\+c$' file.txt
    
  • 匹配包含字符串 abc 的行:

    grep 'abc' file.txt
    
  • 匹配以大写字母开头的单词:

    grep '\b[A-Z]\w*' file.txt
    
  • 匹配数字

要匹配一个或多个数字,可以使用\d+(ERE)或[0-9]\+(BRE)。

例如,在文件中查找包含一个或多个数字的行,可以使用下面的命令:

grep -E '\d+' file.txt    # ERE 模式
grep '[0-9]\+' file.txt  # BRE 模式
  • 匹配IP地址

要匹配IPv4地址,可以使用\b(?:\d{1,3}\.){3}\d{1,3}\b(ERE)或\b\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\b(BRE)。

例如,在文件中查找包含IPv4地址的行,可以使用下面的命令:

grep -E '\b(?:\d{1,3}\.){3}\d{1,3}\b' file.txt   # ERE 模式
grep '\b\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\b' file.txt  # BRE 模式
  • 匹配邮箱地址

要匹配邮箱地址,可以使用\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b(ERE)或\b[A-Za-z0-9._%+-]\+@[A-Za-z0-9.-]\+\.[A-Z|a-z]\{2,\}\b(BRE)。

例如,在文件中查找包含邮箱地址的行,可以使用下面的命令:

grep -E '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' file.txt   # ERE 模式
grep '\b[A-Za-z0-9._%+-]\+@[A-Za-z0-9.-]\+\.[A-Z|a-z]\{2,\}\b' file.txt  # BRE 模式
  • 查找/etc/ssh/sshd_config中不含空行和以#开头的行

    [root@localhost ~]# cat /etc/ssh/sshd_config |egrep -v -n "^$|^#"
    
  • 查找/var/log/messages文件中存在字母长度范围在[14.18]的行

    [root@localhost ~]# cat /var/log/messages|egrep "\<[a-Z]{14,18}\>"
    
  • ip地址的正则表达式

    [root@localhost lianxi]# cat /var/log/secure|egrep "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
    

总结

正则表达式在Shell编程中是非常常用的工具,可以帮助我们快速地匹配和处理文本。本文介绍了Shell中常用的两种正则表达式语法:基本正则表达式和扩展正则表达式,分别介绍了它们的元字符和特殊语法,并给出了一些常见的用法示例。

你可能感兴趣的:(linux,linux,正则表达式,unix)