如何匹配文件中的一些单词并列出匹配单词的所有行?(不带正则表达式)



显示在某个位置工作的所有员工的详细信息,该位置名称中以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个或更多非:字符,然后是ore,最后是字段结尾的:(。

以防万一您会改变主意使用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 

这适用于整个文档匹配

相关内容

  • 没有找到相关文章

最新更新