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>
表示显示匹配行的后num
行文本-B <num>
表示显示匹配行的前num
行文本-C <num>
表示显示匹配行前后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>\
表示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 "\<xiao" -o
-
匹配以
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
-
匹配包含
hello
或world
的行: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中常用的两种正则表达式语法:基本正则表达式和扩展正则表达式,分别介绍了它们的元字符和特殊语法,并给出了一些常见的用法示例。