如何使用grep在平面文件数据库的字段中查找特定单词?

如何使用grep在平面文件数据库的字段中查找特定单词?,grep,Grep,我需要这个grep电话: grep "field3=highland" data_file 以“field3=高地”和“field3=芝加哥高地”返回两个结果。 如何重新设计grep调用以考虑这两种情况?如果您想将行的第三个字段与字符串匹配(而不是匹配文本“field3=highland”)grep不是适合您的工具。在这种情况下,考虑 AWK < /代码>: awk '$3=="highland" { print $0 }' <input file> 从密码文件中获取根行。您可以

我需要这个grep电话:

grep "field3=highland" data_file
以“field3=高地”和“field3=芝加哥高地”返回两个结果。
如何重新设计grep调用以考虑这两种情况?

如果您想将行的第三个字段与字符串匹配(而不是匹配文本“
field3=highland
”)
grep
不是适合您的工具。在这种情况下,考虑<代码> AWK < /代码>:

awk '$3=="highland" { print $0 }' <input file>

从密码文件中获取根行。

您可以使用*通配符

$ grep 'f=h\|f=c h' << eof
> f=c h
> f=h
> not
> going f= to
> match
> eof
f=c h
f=h
$ 
grep "field3=.*highland" data_file

如果要获取所有带有“field3=”后跟任何字符和“highland”的行,则需要:

grep 'field3=.*highland' data_file
表示任何字符,
“*”
表示最后一个模式的零次或多次出现。因此,
'.*
实际上是任何字符串,包括空字符串。

goe

我的建议是在撰写你的问题上花更多的精力

您提到“grep工具(Linux)”和“类似SQL的操作符”。。。在主题中。。。然后包括一个坦率地难以理解的问题,这似乎是关于匹配输入样本行的两个不同变体

你得到的答案只是猜测你的实际问题可能是什么

我认为问题是这样的:

$ grep 'f=.*h' 
“我的数据包含一些行,如:
field3=highland
field3=other stuff highland
,我希望匹配所有这些行(过滤掉所有其他行)。”

可能有效的最简单正则表达式是:

grep "field3=.*highland
。。。但这将匹配“field3=高地”、“field3=thighland”和“myfield3=…”等内容。它也将无法匹配“field3=…”(字段指示器和等号之间的空格)

“字段3”应该在行的开头吗?高地应该锚定在线路的末端吗?仅当“highland”不是较长“word”中的子字符串时(即,如果“h”之前和“d”之后的字符不是字母顺序),是否应匹配

关于您的预期投入和预期结果,有很多问题。。。这将对匹配或不匹配的正则表达式的种类产生相当大的影响

对类SQL表达式及其%tokens的引用基本上是无用的。在大多数情况下,类SQL表达式中的%标记相当于“*”正则表达式。如果您有一个SQL片段可以工作(在相同的输入范围内),并且您正试图找到一个功能等效的正则表达式。。。然后,您应该花时间粘贴工作SQL表达式

此外,在这个问题中没有特别针对
grep
(Linux或其他)的内容。最好将其标记为关于正则表达式的问题

一般来说,有三到四种常见的抽象用于匹配文本与模式:正则表达式(有许多变体)、“glob”和“wildmat”模式(类似shell和MS-DOS)以及类似SQL的表达式

其中,正则表达式是程序员最常用的。。。到目前为止,它们是最复杂的。从最古老最简单的版本(包括在历史上的UNIX
ed
行编辑器中,
grep
最初是从中摘录的),到功能更强大的“扩展”版本(以
egrep
grep-E
为代表),再到精心设计的“Perl兼容正则表达式”(现在被其他编程语言广泛使用,如PCRE库)

Glob模式要简单得多。它们支持“shell通配符”……最初只支持?和*(分别是任意单个字符或任意数量的任意字符)。现代shell和其他工具支持的后续增强包括对字符类的支持(例如[0-9]表示任意数字,[a-zA-Z]表示任意字母,等等)。其中一些还支持否定字符类

因为全局模式使用特殊字符(?和*)这与正则表达式语法相似,尽管目的不同……而且因为它们使用几乎相同的语法来描述字符类及其补码,所以glob模式经常被误认为是正则表达式。当我在系统管理课程中授课时,我通常必须指出这一点,以便学生“忘却”如此普遍的术语的草率

旧MS-DOS“wildmat”或“通配符匹配”可以被认为是原始glob模式的变体。它只支持?和*元字符…与UNIX shell globbing的语义基本相同。但是,我建议不要这样想。MS-DOS命令行处理包含这些模式的参数的基本语义完全不同将它们视为“globs”是一个陷阱(类似于:
COPY*.TXT*.BAK
的命令在MS-DOS下是完全合理的,而类似于:
cp*.TXT*.BAK
的UNIX命令在几乎任何合理的情况下都是错误的)

显然,正如我上面所描述的,类似SQL的表达式与UNIX glob非常相似。在大多数基本的类似SQL的实现(类似于*)和(类似于?)中只有两个“特殊”或“元”字符


不过,请注意这里的黄鼠狼词。我不会声称%与一个glob*相同,也不会声称u一个glob?字符相同。可能会有一些角落的情况(关于如何在字符串的开头或结尾处批处理,或与空格相邻等)。SQL的不同实现之间可能存在差异,甚至可能存在一些更粗糙的UNIX/Linux fnmatch(globbing)库版本,如果您试图依赖这些声明,它们将产生不同。

哦,嗯,好的。这是第三个实际字段,还是这行真的说的是
field3=
?呃…我不知道
grep 'field3=.*highland' data_file
grep "field3=.*highland