![Grep 仅用于以 10 为基数的文件中的二进制 (0,1) 数字](https://linux22.com/image/186421/Grep%20%E4%BB%85%E7%94%A8%E4%BA%8E%E4%BB%A5%2010%20%E4%B8%BA%E5%9F%BA%E6%95%B0%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E4%BA%8C%E8%BF%9B%E5%88%B6%20(0%2C1)%20%E6%95%B0%E5%AD%97.png)
假设我有一个文件,其中包含二进制数 (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”之类的内容。