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

Bab*_*ish 4 scripting ubuntu awk grep

显示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
Run Code Online (Sandbox Code Playgroud)

预期输出:

1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
Run Code Online (Sandbox Code Playgroud)

这是我试过的代码,它只显示位置,但我想要完整的细节

cut -d ":" -f4 employee.txt | grep 'ore\>' 
Run Code Online (Sandbox Code Playgroud)

编辑:已解决

grep "`cut -d ":" -f5 employee.txt | grep 'ore\>'`$" employee.txt
Run Code Online (Sandbox Code Playgroud)

得到输出:

1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
Run Code Online (Sandbox Code Playgroud)

谢谢大家的帮助:)

anu*_*ava 5

这里一个非正则表达式的方法使用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
Run Code Online (Sandbox Code Playgroud)

细节:

  • index($5,s)函数ore$5每行的第五列中查找输入字符串的位置
  • (index($5,s) + length(s)-1) == length($5)检查是为了确保ore$5

正则表达式方法会更简单:

awk -F: -v s="ore" '$5 ~ s "$"' file
Run Code Online (Sandbox Code Playgroud)

  • @Babbaranish 不要使用 grep 进行任何涉及字段匹配的事情,awk 更简单,更强大并且更容易扩展。如果你的字符串是“.txt”而不是“ore”,你可以按原样使用 awk 解决方案,但不能只使用与“ore”相同的“grep”解决方案,因为现在你有了一个正则表达式元字符 (`.`) 必须添加要在搜索字符串中处理的代码。同样,如果您的输入只有 5 个字段而不是 7 个字段,您可以再次按原样使用 awk 解决方案,但您必须更改当前发布的任何 grep 解决方案,因为您的目标字符串后面不再有 `:`。 (3认同)

Rav*_*h13 5

我们可以awk在这里使用这个简单的解决方案。根据 OP 的要求,没有正则表达式方法。简单的解释是:检查第 5 个字段的最后 3 个字符是否为 ore 然后打印该行。

awk 'BEGIN{FS=OFS=":"} substr($5,length($5)-2)=="ore"' Input_file
Run Code Online (Sandbox Code Playgroud)

通用答案:根据 Ed 先生的好建议,在此处添加更通用的解决方案。可以根据字符串设置尾部值的位置需要查看。

awk 'BEGIN{FS=OFS=":"; tail="ore"} substr($5,length($5)-length(tail)+1)==tail' Input_file
Run Code Online (Sandbox Code Playgroud)