Grep 排除以 0 结尾的行,但不包括 10、100 等

Grep 排除以 0 结尾的行,但不包括 10、100 等

我有一个文件在 Linux 和 Unix 环境中具有这种模式。

# file1
text1   98432230
text2    123412
text3        10
line4         0
line5         0
line6     40000
...         ...
line10       20
...         ... 

我试图排除以 结尾的行0,但不排除以102040000等结尾的行98432230

我已经测试过 、|grep -v "\0$"| grep -v "[[:space:]]0$"| grep -v " 0"| sed '/0/d'| sed "/0$/d"但它们都不起作用,因为它们排除了任何以 0 结尾的行,包括 10、20、40000 和 98432230。

有什么建议么?

答案1

不要使用grep,而是使用awk

$ awk '$NF!=0' file
text1   98432230
text2    123412
text3        10
line6     40000
...         ...
line10       20
...         ... 

在 中awk,变量NFs 是字段数,$NF最后一个字段也是如此。计算结果为 true 的表达式意味着“打印此行”,因此$NF!=0意味着“打印最后一个字段不为 0 的每一行”。

您甚至可以将其进一步简化为:

awk '$NF' file

答案2

对于 grep,您需要一个匹配三项内容的正则表达式:非数字字符,后跟“0”,位于行尾:

grep -v '[^0-9]0$'

您是否还想匹配并丢弃所有仅以两个零结尾的行00

答案3

你需要匹配一个 0,这样你就可以说它是一个完整的“单词”

grep -vw '0$'只会匹配(并因为 而排除-v)以“单词”0 结尾的行。

答案4

使用(以前称为 Perl_6)

raku -ne '.put if .grep( none / \D 0 $/ );'    

上面使用了Raku的grep例程。正则表达式原子\D是非数字。该例程利用了 Raku 的none连接点,该连接点测试是否存在正则表达式匹配。如果您只是put不带条件地返回if,则会返回原始文件,其中包含未找到匹配项的空白行。

输入示例:

text1  98432230
text2    123412
text3        10
line4         0
line5         0
line6     40000
line10       20

示例输出:

text1  98432230
text2    123412
text3        10
line6     40000
line10       20

TMTOWTDI:在这种情况下,换出grep并使用 match会产生相同的回报。也match(/…/)可以更简单地写为m/…/,并且nonegrep/match 运算符内部可以与前面的内容交换!,如下所示。 (特别感谢 Bruce Gray 的见解/讨论):

raku -ne '.put if .match( none / \D 0 $/ );' 

#OR

raku -ne '.put if  ! .match( / \D 0 $/ );'  

#OR

raku -ne '.put if  ! m/ \D 0 $/;'  

https://docs.raku.org/routine/none
https://docs.raku.org/routine/grep
https://raku.org

相关内容