我有一个文件。我需要使用 grep 打印数量在 100-500 之间的所有行

我有一个文件。我需要使用 grep 打印数量在 100-500 之间的所有行

在下面的示例中,数量是带有“38”标签的字段,例如第一行的 38=842。

Order:167342,9=205|21=1|553=2453|49=11342|56=MBT|10=085|55=/GCQ3|1=30532|114=Y|40=1|35=D|54=|60=20130624-09:45:02.046|34=388|11=|38=842|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|

Order:544291,52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|54=|60=20130624-09:45:02.046|40=1|35=D|34=388|11=|38=952|56=MBT|1=30532|114=Y|10=085|55=/GCQ3|9=205|21=1|553=2453|49=11342|

Order:916070,35=D|40=1|54=|60=20130624-09:45:02.046|38=234|34=388|11=|59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|9=205|553=2453|49=11342|21=1|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|

Order:332907,9=205|49=11342|553=2453|21=1|56=MBT|114=Y|1=30532|55=/GCQ3|10=085|60=20130624-09:45:02.046|54=|35=D|40=1|38=26|11=|34=388|59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|

Order:385327,38=190|34=388|11=|35=D|40=1|60=20130624-09:45:02.046|54=|8=FIX.4.4|43=Y|100=MBTX|59=0|52=20130624-09:45:02.046|553=2453|49=11342|21=1|9=205|55=/GCQ3|10=085|1=30532|114=Y|56=MBT|

Order:610550,59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|35=D|40=1|54=|60=20130624-09:45:02.046|38=521|11=|34=388|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|9=205|553=2453|49=11342|21=1|

Order:408689,59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|35=D|40=1|60=20130624-09:45:02.046|54=|38=658|34=388|11=|56=MBT|55=/GCQ3|10=085|114=Y|1=30532|9=205|49=11342|553=2453|21=1|

Order:43899,56=MBT|10=085|55=/GCQ3|114=Y|1=30532|9=205|21=1|49=11342|553=2453|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|40=1|35=D|60=20130624-09:45:02.046|54=|11=|34=388|38=531|

答案1

如果您不习惯使用 grep,那么在 Perl 中这很容易。如果该行匹配 \ 或 ,后跟 38=,则放置所有字符直到下一个 | 1 美元。然后打印 $1 介于 100 到 500 之间的行。

$ perl -ne 'if(/[\|,]38=(.*)\|/&&$1>99&&$1<501){print $_}' q
Order:916070,35=D|40=1|54=|60=20130624-09:45:02.046|38=234|34=388|11=|59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|9=205|553=2453|49=11342|21=1|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|
Order:385327,38=190|34=388|11=|35=D|40=1|60=20130624-09:45:02.046|54=|8=FIX.4.4|43=Y|100=MBTX|59=0|52=20130624-09:45:02.046|553=2453|49=11342|21=1|9=205|55=/GCQ3|10=085|1=30532|114=Y|56=MBT|
$

使用 grep 我们没有 > 和 < 运算符(据我所知),查找相同的 38= 模式,后跟 [1-4][0-9][0-9] (100 到 499)或500。

$ grep -E '[,|]38=([1-4][0-9][0-9]|500)\|' q
Order:916070,35=D|40=1|54=|60=20130624-09:45:02.046|38=234|34=388|11=|59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|9=205|553=2453|49=11342|21=1|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|
Order:385327,38=190|34=388|11=|35=D|40=1|60=20130624-09:45:02.046|54=|8=FIX.4.4|43=Y|100=MBTX|59=0|52=20130624-09:45:02.046|553=2453|49=11342|21=1|9=205|55=/GCQ3|10=085|1=30532|114=Y|56=MBT|
$

相关内容