我有一个命令,它向stdout
一系列数字发送数据,每个数字占一行。我需要确定列表中是否存在特定数字。匹配必须是精确的,而不是子集。例如,解决此问题的一种简单但行不通的方法是:
/run/command/outputing/numbers | grep -c <numberToSearch>
我的版本在搜索“456”时对以下列表给出了误报:
1234567
98765
23
1771
如果计数非零,则表示找到匹配项,如果计数为零,则表示该数字不在列表中。
问题在于 numberToSearch 可以匹配一行上的数字子序列,而我只想匹配整行。我查看了 grep 的手册页,没有找到任何只匹配整行的方法。有没有办法做到这一点,或者我最好使用或awk
或sed
其他工具?我需要一个二进制答案来确定要搜索的数字是否存在。
答案1
添加到安斯加的回答,考虑用-l
(小写L)代替-c
。它(-l
)会给你一个是或否的答案。
/run/command/outputting/numbers | grep –l '^456$'
如果找到匹配的行,将输出“ (standard input)
”并以状态 0 退出;如果未找到文本,它将不输出任何内容并以状态 1 退出。 的某些版本grep
还支持-q
(quiet) 选项,它将抑制所有输出并仅给出退出状态。
这些选项的优点是它们能够在第一次遇到搜索字符串时退出,并且不需要读取整个输入。如果您需要命令运行完成,这些选项可能会有害。
答案2
来自 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>
将获得整行匹配的数量。
答案3
num=23
/run/command/outputing/numbers | grep -c "^$num$"
将 23 替换为您要查找的数字。