Grep 仅用于以 10 为基数的文件中的二进制 (0,1) 数字

Grep 仅用于以 10 为基数的文件中的二进制 (0,1) 数字

假设我有一个文件,其中包含二进制数 (0,1) 和其他一些以 10 为基数的数字 (0-9):

010... 10567
011... 23678
...

ETC。

上面的例子实际上并不是它们的准确表示,但这不是重点(并且只是为了说明这个具体情况)

我已经知道如何在文件/输出中仅查找“数字”:

grep '[0-9]*'

使用这个:

grep '[0-1]*'

将突出显示/选择属于 10 进制数字一部分的 1 和 0。

所以我不确定如何做同样的事情只是二进制数 (0,1)。因此示例输出只会显示二进制数(二进制数始终位于同一列中)。

有什么方法可以做到这一点吗?

答案1

下面将查看 列 中的数据col,每当该列中的数据仅包含 1 和 0 时,就会打印该数据。

col号在命令行上给出(我1在这里使用它的值):

awk -v col=1 '$col ~ /^[01]+$/ { print $col }' file

如果您知道二进制数始终以零开头,那么您可以将表达式从 更改为^[01]+$^0[01]*$一个零后跟任意数量的一和/或零)。如果你此外知道您的二进制数始终是三位数长,请使用^0[01][01]$^0[01]{2}$

测试:

$ cat file
010 10567
011 23678
030 10567
012 23678
$ awk -v col=1 '$col ~ /^[01]+$/ { print $col }' file
010
011

答案2

一个更简单的解决方案是:

grep -E "\<[01]+\>" filename

\<\>是单词边界,正则表达式匹配 1 次或多次出现01

您还可以使用 awk 只匹配指定的列;使用 awk,如果二进制字符串位于第 1 列,则可以执行以下操作:

awk 'match($1,/\<[01]+\>/) {print $1}'

答案3

当我找到一个更好的解决方案时(归功于评论部分的@Inian)之前的帖子为解决方案)

grep -E '\b[01]+\b'

这似乎适用于实际的仅二进制输入。它也不会错误地匹配属于十进制/其他数字一部分的二进制数。

所以:

echo "10198865" |  grep -E '\b[01]+\b'

什么也不输出,但是:

echo "101010" |  grep -E '\b[01]+\b'

做。

答案4

听起来您需要搜索一些连续的数字0,并且1之前或之后没有任何其他数字。所以,类似这样的事情,至少连续 3 次0并且1(未经测试):

[^2-9][01]{3,}[^2-9]

编辑:正如评论中提到的,这也匹配“210001”之类的内容。

相关内容