如何搜索文件以匹配整行?


1

我有一个命令发送到stdout一系列数字,每个数字都在一个新行上。我需要确定列表中是否存在特定数字。匹配需要精确,而不是子集。例如,一种不起作用的简单方法是:

/run/command/outputing/numbers | grep -c <numberToSearch>

在搜索'456'时,我的这个版本在以下列表中给出了误报:

1234567
98765
23
1771

如果计数非零,则找到匹配项,或者如果它为零,则该数字不在列表中。

这个问题是numberToSearch可以匹配一行中数字的子序列,而我只想在整行上点击。我查看了grep的手册页,并没有看到任何只匹配整行的方法。有没有办法做到这一点,或者我会更好地使用awksed其他工具?我需要一个二进制答案,以确定是否存在要搜索的号码。


Answers:


1

添加到Ansgar的答案,考虑-l(小写L)而不是-c。It(-l)会给你一个是或否答案。

/run/command/outputting/numbers | grep –l '^456$'

(standard input)如果找到匹配的行,将输出“ ”并以状态0退出; 如果找不到文本,它将不输出任何内容并退出状态为1.某些版本grep还支持-q(安静)选项,这将禁止所有输出并仅提供退出状态。

这些优点是它们能够在第一次遇到搜索字符串时退出,并且不需要读取整个输入。如果您需要命令运行完成,这些选项可能有害。


5

从GNU grep手册:

`-x'
`--line-regexp'
     Select only those matches that exactly match the whole line.
     (`-x' is specified by POSIX.)

所以:

/run/command/outputing/numbers | grep -x <numberToSearch>

会得到你的全线比赛:

/run/command/outputing/numbers | grep -cx <numberToSearch> 

将获得全线比赛的数量。


2
num=23
/run/command/outputing/numbers | grep -c "^$num$"

将23替换为您要查找的号码。


如果William正在使用C shell,那就需要像"^$num"'$'
Scott
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.