显示在某个位置工作的所有员工的详细信息,该位置名称中以ore
结尾
EmpID:Name:Designation:UnitName:Location:DateofJoining:Salary
1001:Thomson:SE:IVS:Mumbai:10-Feb-1999:60000
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1003:Jackson:DM:IMS:Hyderabad:23-Apr-1985:90000
1004:BobGL::ETA:Mumbai:05-Jan-2004:55000
1005:Alice:PA:::26-Aug-2014:25000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
1007:Kirsten:PM:IMS:Mumbai:26-Aug-2014:45000
1004:BobGL::ETA:Mumbai:05-Jan-2021:55000
预期输出:
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
这是我试过的代码,它只显示位置,但我想要完整的细节
cut -d ":" -f4 employee.txt | grep 'ore>'
编辑:已解决
grep "`cut -d ":" -f5 employee.txt | grep 'ore>'`$" employee.txt
获得输出:
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
感谢大家的帮助:(
这里是使用awk
:的非正则表达式方法
awk -F: -v s="ore" '(n=index($5,s)) && (n + length(s)-1) == length($5)' file
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
详细信息:
index($5,s)
函数查找输入字符串ore
在第五列中的位置,即每行的$5
(index($5,s) + length(s)-1) == length($5)
检查是为了确保ore
是$5
的结束子串
正则表达式方法会更简单:
awk -F: -v s="ore" '$5 ~ s "$"' file
我们可以在这里使用这个简单的awk
解决方案。根据OP的要求,没有正则表达式方法。简单的解释是:检查第五个字段最后3个字符是否为ore,然后打印该行。
awk 'BEGIN{FS=OFS=":"} substr($5,length($5)-2)=="ore"' Input_file
通用答案:根据Ed先生的建议,在这里添加更多通用解决方案。在哪里可以根据字符串设置tail的值需要查看。
awk 'BEGIN{FS=OFS=":"; tail="ore"} substr($5,length($5)-length(tail)+1)==tail' Input_file
仅使用grep
(使用正则表达式;在grep
中避免它们的唯一方法是使用grep -F
,它进行文字字符串匹配(:
$ grep -E '^([^:]*:){4}[^:]*ore:' input.txt
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
说明:
使用Extended而不是Basic正则表达式语法提高可读性:
从行的开头开始,匹配四个字段(0个或多个非:
字符,后面跟着一个:
(,然后是以ore结尾的第五个字段(同样,0个或更多非:
字符,然后是o
、r
、e
,最后是字段结尾的:
(。
以防万一您会改变主意使用regex。
使用awk:
$ awk -F: -v ends="ore" '$5~".*"ends' file.txt
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
使用grep:
$ grep 'ore:' file.txt
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
或者这个:
$ grep -E '(.*:){4}.*ore:' file.txt
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
fgrep "ore:" employee.txt
f(ast(grep是完全字符串匹配无正则表达式(与grep -F
相同(
它将不知道它匹配的是哪一列,因此过滤必须在之前或之后进行。
awk -F: '{if (substr($5,1)~"ore")print $0}' emp.txt
这适用于完全一致的
grep -Ri "ore" emp.txt
这适用于整个文档匹配