如何匹配文件中的某些单词并列出该匹配单词的所有行? (没有正则表达式)
Posted
技术标签:
【中文标题】如何匹配文件中的某些单词并列出该匹配单词的所有行? (没有正则表达式)【英文标题】:How to match some words from file and list all the rows of that matching word? (without regex) 【发布时间】:2021-09-04 08:20:07 【问题描述】:显示在位置名称以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: '$5 ~ /ore$/' input.txt
cut -d ":" -f4 employee.txt | grep 'ore\>' 继承人的代码它只显示我想要完整详细信息的位置@anubhava
@Shawn 我是新手,考试我必须使用 grep 所以不能使用 awk。
OP 指定(没有正则表达式)请不要删除它,否则答案看起来无关紧要。
【参考方案1】:
这里是使用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
【讨论】:
感谢您的解释。我们可以对 grep 使用同样的方法吗?还是仅适用于awk? p.s.从未使用过 awk。 学习awk
,功能更强大,功能更丰富。顺便说一句grep
不能没有正则表达式
我开始越来越欣赏 awk
@Babbaranish 不要将 grep 用于涉及字段匹配的任何事情,awk 更简单、更健壮且更易于扩展。如果您的字符串是 .txt
而不是 ore
您可以按原样使用 awk 解决方案,但您不能只使用与 ore
相同的 grep
解决方案,因为现在您有一个正则表达式元字符(.
) 必须在搜索字符串中添加要处理的代码。同样,如果您的输入只有 5 个字段而不是 7 个字段,您可以再次按原样使用 awk 解决方案,但您必须更改任何当前发布的 grep 解决方案,因为您的目标字符串后面不再有 :
。【参考方案2】:
我们可以在这里使用这个简单的awk
解决方案。根据 OP 的要求,没有正则表达式方法。简单的解释是:检查第 5 个字段的最后 3 个字符是否是或然后打印该行。
awk 'BEGINFS=OFS=":" substr($5,length($5)-2)=="ore"' Input_file
通用答案:根据 Ed sir 的好建议,在此处添加更通用的解决方案。需要查看可以根据字符串设置尾部值的位置。
awk 'BEGINFS=OFS=":"; tail="ore" substr($5,length($5)-length(tail)+1)==tail' Input_file
【讨论】:
【参考方案3】:仅使用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
解释:
使用扩展而不是基本正则表达式语法以提高可读性:
从行首开始,匹配四个字段(0 个或多个非:
字符后跟一个:
),然后是第五个以 ore 结尾的字段(同样,0 个或多个非@ 987654327@ 个字符,然后是 o
、r
、e
,最后是字段末尾的 :
。
【讨论】:
用于比较的 BRE 版本:grep '^\([^:]*:\)\4\[^:]*ore:' input.txt
【参考方案4】:
以防万一您改变主意使用正则表达式。
使用 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
【讨论】:
【参考方案5】:fgrep "ore:" employee.txt
f(ast)grep 是完全匹配无正则表达式的字符串(与grep -F
相同)
它不会知道它匹配的是哪一列, 所以过滤器必须在之前或之后发生。
【讨论】:
以上是关于如何匹配文件中的某些单词并列出该匹配单词的所有行? (没有正则表达式)的主要内容,如果未能解决你的问题,请参考以下文章