我需要执行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
答案 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
中的所有行。