Grep 行包含一个单词或长度在特定范围内?

Grep 行包含一个单词或长度在特定范围内?
1598427@931
PDD   220624P00051000 ohlc=0,0,0,0 vol=0 oi=424 nbbo=69@2316/113@532 nbbo2=69@145/113@95
PDD   220617C00051000 ohlc=0,0,0,0 vol=0 oi=434 nbbo=530@1921/710@1496 nbbo2=530@31/710@115
PDD   220722P00051000 ohlc=0,0,0,0 vol=0 oi=15 nbbo=285@1436/405@1772 nbbo2=230@15/455@15
PDD   220708C00051000 ohlc=0,0,0,0 vol=0 oi=17 nbbo=785@864/935@894 nbbo2=785@15/935@15
PDD   220624C00051000 ohlc=0,0,0,0 vol=0 oi=392 nbbo=645@771/795@947 nbbo2=645@83/795@80
PDD   220729C00051000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=870@902/1190@677 nbbo2=820@15/1195@20
PDD   220708P00051000 ohlc=0,0,0,0 vol=0 oi=32 nbbo=200@1413/320@2273 nbbo2=200@15/320@356
PDD   220722C00051000 ohlc=0,0,0,0 vol=0 oi=140 nbbo=795@1630/1175@1544 nbbo2=795@51/1175@21
PDD   220729P00051000 ohlc=0,0,0,0 vol=0 oi=11 nbbo=254@3/450@3 nbbo2=254@2/570@1
CSCO  220715C00090000 ohlc=0,0,0,0 vol=0 oi=739 nbbo=0@0/4@1056 nbbo2=0@0/4@121
CSCO  220617C00090000 ohlc=0,0,0,0 vol=0 oi=203 nbbo=0@0/1@2 nbbo2=0@0/0@0
CSCO  220617P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4685@654/4730@1155 nbbo2=4685@33/4730@33
CSCO  240119P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4695@202/4770@193 nbbo2=4695@75/4770@33

我有一个与上面类似的文件。

我想找到包含单词CSCO或长度的所有行<= 15

我可以使用什么命令来执行此操作?

答案1

对于grep -E扩展正则表达式,您可以使用交替 ( |)。

$ grep -E 'CSCO|^.{0,15}$' file
1598427@931
CSCO  220715C00090000 ohlc=0,0,0,0 vol=0 oi=739 nbbo=0@0/4@1056 nbbo2=0@0/4@121
CSCO  220617C00090000 ohlc=0,0,0,0 vol=0 oi=203 nbbo=0@0/1@2 nbbo2=0@0/0@0
CSCO  220617P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4685@654/4730@1155 nbbo2=4685@33/4730@33
CSCO  240119P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4695@202/4770@193 nbbo2=4695@75/4770@33

如果您只想匹配位于行开头且后跟空格(空格、制表符等)的“CSCO”:

$ grep -E '^CSCO[[:space:]]|^.{0,15}$' file

或者使用字尾边界标记\>(我不记得这是 GNU 扩展还是“标准”,而且很难用 Google 搜索到。它在 GNU grep 中肯定有效,也许在其他语言中也有效):

$ grep -E '^CSCO\>|^.{0,15}$' file

请注意,GNU grep 的信息文档将“单词”字符定义为[_[:alnum:]],这与手册页中的定义不同perlre,perl 还将一些连接标点符号和 unicode 字符识别为“单词”。

如果您使用 GNU grep,该版本也可以理解 perl 的\s(任何空格)和\b(单词边界标记),即使使用-E而不是-P. GNU grep 的-PPCRE 支持选项增加了\h对水平空白的识别。例如

$ grep -E '^CSCO\s|^.{0,15}$' file
$ grep -E '^CSCO\b|^.{0,15}$' file
$ grep -P '^CSCO\h|^.{0,15}$' file

答案2

grep -e CSCO -e '^.\{0,15\}$' filename

这里你给 grep 两个要查找的模式。第一个是“CSCO”:因此它将匹配任何与之匹配的行。第二个查找行的开头^,后跟任何.出现 0 到 15 次的字符\{0,15\},然后是行的结尾$

如果 CSCO 必须是一个完整的“单词”,而不是较大单词或模式的一部分,您可以使用'\<CSCO\>'or'\bCSCO\b'或 ,具体'[[:<:]]CSCO[[:>:]]'取决于您的grep实现(\<\>是最常支持的),所有这些都是在之间的转换处匹配的单词边界运算符一个单词字符(数字或下划线)和一个非单词字符(所有其他字符)。

答案3

我猜CSCO是一号提交的。 awk方法:

awk '$1 == "CSCO"; length <= 15 { print }' INPUT
# length is a built-in awk function which returns the length of a line

答案4

使用(以前称为 Perl_6)

raku -ne '.put if (.contains("CSCO")) | (.chars <= 15);'   

或者

raku -ne '.put if .contains("CSCO") or .chars <= 15;'   

输入示例:

1598427@931
PDD   220624P00051000 ohlc=0,0,0,0 vol=0 oi=424 nbbo=69@2316/113@532 nbbo2=69@145/113@95
PDD   220617C00051000 ohlc=0,0,0,0 vol=0 oi=434 nbbo=530@1921/710@1496 nbbo2=530@31/710@115
PDD   220722P00051000 ohlc=0,0,0,0 vol=0 oi=15 nbbo=285@1436/405@1772 nbbo2=230@15/455@15
PDD   220708C00051000 ohlc=0,0,0,0 vol=0 oi=17 nbbo=785@864/935@894 nbbo2=785@15/935@15
PDD   220624C00051000 ohlc=0,0,0,0 vol=0 oi=392 nbbo=645@771/795@947 nbbo2=645@83/795@80
PDD   220729C00051000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=870@902/1190@677 nbbo2=820@15/1195@20
PDD   220708P00051000 ohlc=0,0,0,0 vol=0 oi=32 nbbo=200@1413/320@2273 nbbo2=200@15/320@356
PDD   220722C00051000 ohlc=0,0,0,0 vol=0 oi=140 nbbo=795@1630/1175@1544 nbbo2=795@51/1175@21
PDD   220729P00051000 ohlc=0,0,0,0 vol=0 oi=11 nbbo=254@3/450@3 nbbo2=254@2/570@1
CSCO  220715C00090000 ohlc=0,0,0,0 vol=0 oi=739 nbbo=0@0/4@1056 nbbo2=0@0/4@121
CSCO  220617C00090000 ohlc=0,0,0,0 vol=0 oi=203 nbbo=0@0/1@2 nbbo2=0@0/0@0
CSCO  220617P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4685@654/4730@1155 nbbo2=4685@33/4730@33
CSCO  240119P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4695@202/4770@193 nbbo2=4695@75/4770@33

示例输出:

1598427@931
CSCO  220715C00090000 ohlc=0,0,0,0 vol=0 oi=739 nbbo=0@0/4@1056 nbbo2=0@0/4@121
CSCO  220617C00090000 ohlc=0,0,0,0 vol=0 oi=203 nbbo=0@0/1@2 nbbo2=0@0/0@0
CSCO  220617P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4685@654/4730@1155 nbbo2=4685@33/4730@33
CSCO  240119P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4695@202/4770@193 nbbo2=4695@75/4770@33

Raku 中的答案需要尊重 OR 命令相对于其他代码元素的优先级。上面,在第一个示例中,通过在(高优先级) |(管道)OR 运算符两侧的两个条件周围放置括号来获得所需的答案。如果要删除括号,请使用(低优先级)or(小写)OR 运算符。

请注意下面第二个 URL 中的引用:“请注意,这or很容易被滥用。请参阅陷阱”。

https://docs.raku.org/language/operators#Operator_precedence
https://docs.raku.org/routine/or
https://docs.raku.org/routine/|

相关内容