如何使用grep命令在文件的最后一个字段中显示大于100k且小于140k的条目

时间:2019-05-04 00:27:17

标签: linux bash

我需要执行grep命令以从员工文件中选择条目。

员工列表文件的薪水是文件中每行的最后一个字段。

我如何使用grep仅选择薪水大于100000且小于140000的员工?

这是我到目前为止的内容,但是我不知道如何防止列表中的100000个结果显示在grep结果中。

CHAR

这是我从grep获得的结果...

grep "[1][0-3]....$" emp.lst

这是emp.lst的整个文件的$ grep "[1][0-3]....$" emp.lst 0110 :v.k. agrawal :g.m. :marketing :12/31/40 :100000 0110 :v.k. agrawal :g.m. :marketing :12/31/40 :130000 0110 :v.k. agrawal :g.m. :marketing :12/31/40 :120000 ...

cat

4 个答案:

答案 0 :(得分:5)

虽然我可以尝试使用正则表达式来简化数值比较,但我建议您反对它。像awk之类的东西似乎更适合手头的任务。

awk '{if( gensub( /:/, "",1, $NF) > 100000 && gensub( /:/, "",1, $NF) < 140000){print}}' emp.lst
0110    :v.k. agrawal        :g.m.      :marketing      :12/31/40  :130000
0110    :v.k. agrawal        :g.m.      :marketing      :12/31/40  :120000

由于格式似乎是固定宽度,因此我用:替换了所有内容,以免在每一行的最后一个字段进行数值比较。

答案 1 :(得分:4)

简单的答案是使用[1-3][0-3]字符类作为第二个数字,并将[0-3]的替代项限制为{{1 }}类的结尾。不要忘记将表达式锚定到行尾,例如

[1-9]

$ grep '1[1-3][0-9][0-9][0-9][0-9]$\|1[0-3][0-9][0-9][0-9][1-9]$' file 0110 :v.k. agrawal :g.m. :marketing :12/31/40 :130000 0110 :v.k. agrawal :g.m. :marketing :12/31/40 :120000 捕获1[1-3][0-9][0-9][0-9][0-9]$的地方,而110000-139999确保小于1[0-3][0-9][0-9][0-9][1-9]的值被忽略。

要处理所有值,包括示例中未显示的值,可以扩展表达式以检查每个值,并以100001开头,例如

[:]

如果您还有其他问题,请告诉我。

答案 2 :(得分:4)

您的教练已经脱离了轨道,因为这对于grep来说是完全不适当的任务,即使是练习也是如此。除非她试图教你this quote的含义,否则:

Some people, when confronted with a problem, think
“I know, I'll use regular expressions.”  Now they have two problems. 

无论如何,在UNIX中执行此操作的正确方法是:

$ awk -F: '$NF>100000 && $NF<140000' file
0110    :v.k. agrawal        :g.m.      :marketing      :12/31/40  :130000
0110    :v.k. agrawal        :g.m.      :marketing      :12/31/40  :120000

答案 3 :(得分:1)

如果您可以使用与perl兼容的正则表达式(grep -P),则可以执行以下操作:

grep -P ':(?=1[0-3]\d{4}$)(?!100000$)' emp.lst

: - required so that we will have a main expression and not only lookaheads
(?=1[0-3]\d{4}$) - positive lookahead that will match all the numbers less than 140000
(?!100000$) - negative lookahead that will discard 100000 matches

之所以有效,是因为先行者不消耗字符,否定的字符会重新检查正向匹配的字符。

如果您不能使用grep -P,则可以使用管道:

grep "[1][0-3]....$" emp.lst | grep -v ':100000$'

grep -v不返回匹配的内容,因此将过滤100000中的所有行。