自1974年以来,Linuxgrep命令一直在帮助人们查找文件中的字符串。但有时grep过于彻底。这里有几种方法告诉grep忽略不同的事情。
grep命令
grep命令搜索文本文件,查找与您在命令行上提供的搜索模式匹配的字符串。grep的强大之处在于它使用正则表达式。这些可以让你描述你正在寻找的东西,而不是必须明确地定义它。
grep的诞生早于Linux。它是20世纪70年代初在Unix上开发的。它的名字取自ed行编辑器中的g/re/p键序列(顺便提一下,发音为“ee-dee”)。这代表全球定期快递搜索,打印匹配行。
grep也许以彻底和专一著称。有时,它会搜索文件或目录,你希望它不要浪费时间,因为搜索结果可能会让你看不到树木中的树木。
当然,有一些方法可以统治格雷普。您可以告诉它忽略模式、文件和目录,以便grep更快地完成搜索,并且您不会被无意义的误报淹没。
不包括图案
要使用grep进行搜索,可以通过管道从其他进程(如cat)向其输入信息,也可以提供文件名作为最后一个命令行参数。
我们使用了一个短文件,其中包含刘易斯·卡罗尔的《Jabberwocky》这首诗的文本。在这两个示例中,我们搜索与搜索词“Jabberwock”匹配的行
cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock" jabberwocky.text
为我们列出了包含与搜索线索匹配的行,每行中的匹配元素以红色突出显示。这是简单的搜索。但是,如果我们想排除包含单词“Jabberwock”的行并打印其余的行,该怎么办?
我们可以使用-v(invert-match)选项来实现这一点。这将列出与搜索词不匹配的行。
grep -v "Jabberwock" jabberwocky.text
不包含“Jabberwock”的行将列在终端窗口中。
我们可以根据自己的意愿排除尽可能多的条款。让我们过滤掉所有包含“Jabberwock”的行以及所有包含“and”的行。为了实现这一点,我们将使用-e(expression)选项。我们需要为我们使用的每个搜索模式使用它。
grep -v -e "Jabberwock" -e "and" jabberwocky.txt
输出中的行数也相应减少。
如果我们使用-E(扩展正则表达式)选项,我们可以将搜索模式与“|”结合起来,在这里,“|”并不表示管道,而是逻辑OR运算符。
grep -Ev "Jabberwock|and" jabberwocky.txt
我们得到了与前一个较长的命令完全相同的输出。
如果要使用正则表达式模式而不是显式搜索线索,则命令的格式相同。此命令将排除“ACHT”集合中以任何字母开头的所有行
grep -Ev "^ACHT" jabberwocky.txt
要查看包含模式但也不包含其他模式的行,我们可以将grep导入grep。我们将搜索所有包含单词“Jabberwock”的行,然后过滤掉所有还包含单词“slain”的行
grep "Jabberwock" jabberwocky.txt | grep -v "slain"
排除文件
我们可以要求grep在文件集合中查找字符串或模式。您可以在命令行中列出每个文件,但对于许多无法扩展的文件。
grep "vorpal" verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt
请注意,包含匹配行的文件的名称显示在每行输出的开头。
为了减少键入,我们可以使用通配符。但这可能违反直觉。这似乎有效。
grep "vorpal" *.txt
然而,在这个目录中还有其他TXT文件,与诗歌无关。如果我们搜索具有相同命令结构的单词“剑”,我们会得到很多误报。
grep "sword" *.txt
我们想要的结果被来自其他扩展名为TXT的文件的大量错误结果所掩盖。
单词“vorpal”与任何单词都不匹配,但单词“password”中包含“sw剑”,因此在一些伪日志文件中多次找到它。
我们需要排除这些文件。为此,我们将使用--exclude选项。要排除名为“vol-log-1.txt”的单个文件,我们可以使用以下命令:
grep --exclude=vol-log-1.txt "sword" *.txt
在本例中,我们要排除名称以“vol.”开头的多个日志文件。我们需要的语法是:
grep --exclude=vol*.txt "sword" *.txt
当我们使用-R(取消引用递归)选项时,grep将为我们搜索整个目录树。默认情况下,它将搜索这些位置中的所有文件。我们很可能要排除多种类型的文件。
在此测试计算机上的当前目录下,有包含日志文件、CSV文件和MD文件的嵌套目录。这些是我们要排除的所有类型的文本文件。我们可以对每个文件类型使用--exclude选项,但通过对文件类型进行分组,可以更有效地实现我们想要的。
此命令排除所有扩展名为CSV或MD的文件,以及名称以“vol”或“log”开头的所有TXT文件
grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword" /home/dave/data/
排除目录
如果要忽略的文件包含在目录中,并且这些目录中没有我们要搜索的文件,我们可以排除这些整个目录。
这个概念与排除文件的概念非常相似,只是我们使用--exclude-dir选项并命名要忽略的目录。
grep -R --exclude-dir=backup "vorpal" /home/dave/data
我们已经排除了“backup”目录,但仍在搜索另一个名为“backup2”的目录
毫不奇怪,我们可以在一个命令中多次使用--exclude-dir选项。请注意,排除的目录的路径应该相对于搜索将在其中开始的目录给出。不要使用文件系统根目录的绝对路径。
grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal" /home/dave/data
我们也可以使用分组。我们可以通过以下方式更简洁地实现同样的目标:
grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data
可以在同一命令中组合文件和目录排除。如果要从目录中排除所有文件,并从搜索的目录中排除某些文件类型,请使用以下语法:
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data
有时,这是你遗漏的
有时,使用grep时,感觉就像大海捞针。清除干草堆会有很大的不同。
RELATED:如何在Linux上使用正则表达式(regex)