英文:
Grep Match entire email multiple lines
问题
I want the output to be:
./j/r:franky@list.ru:Test2
./j/d:jdmq77@hotmail.com:Test3
./w/i:willow@gmail.com@gmail.com:Test6
英文:
I have two files:
I have this fist file:
./j/n:jwillow@gmail.com:Test1
./n/o:nanofranky@list.ru:Test2
./j/r:franky@list.ru:Test2
./j/d:jdmq77@hotmail.com:Test3
./x/s:xsebastianmenendez@hotmail.com:Test4
./r/s:rsebastianmenendez@hotmail.com:Test5
./w/i:willow@gmail.com@gmail.com:Test6
And I want it to match this second file, but the whole email, not just the appearance of the word:
willow@gmail.com
franky@list.ru
jdmq77@hotmail.com
sebastianmenendez@hotmail.com
So I want the output to be:
./j/r:franky@list.ru:Test2
./j/d:jdmq77@hotmail.com:Test3
./w/i:willow@gmail.com@gmail.com:Test6
I try with grep -f
, but, since the words appear in the email, I get all the lines of the first file, not just the ones that matches with the whole email.
答案1
得分: 4
Use the -w
argument.
Output:
./w/i:willow@gmail.com@gmail.com:Test6
英文:
Use the -w
argument.
grep -w 'willow@gmail.com' file.txt
Output:
./w/i:willow@gmail.com@gmail.com:Test6
Bash script example to compare two files:
#!/bin/bash
strings_file="search_for.txt"
input_file="in.txt"
grep -w -F -f "$strings_file" "$input_file"
答案2
得分: 3
你可以使用以下命令:
grep -wFf second_file.txt first_file.txt
这里,second_file.txt
是包含你想匹配的电子邮件地址的文件,而 first_file.txt
是你想在其中搜索匹配项的文件。
-w
选项确保只匹配整个单词,而 -F
选项将搜索模式视为固定字符串(不是正则表达式)。
英文:
You may use:
grep -wFf second_file.txt first_file.txt
Here, second_file.txt
is the file containing the email addresses you want to match, and first_file.txt
is the file you want to search for matches in.
The -w
option ensures that only whole words are matched, and the -F
option treats the search pattern as a fixed string (not a regular expression though).
答案3
得分: 0
这可能是你想要的,使用任何awk:
NR == FNR { tgts[$1]; next }
{ email=$0; sub(/[^:]+:/,"",email); sub(/:[^:]+$/,"",email) }
email in tgts
它没有产生预期的输出,因为我认为在file1中存在无效的电子邮件地址willow@gmail.com@gmail.com
并匹配file2中的willow@gmail.com
可能是问题中的拼写错误。
英文:
This might be what you want, using any awk:
$ awk '
NR == FNR { tgts[$1]; next }
{ email=$0; sub(/[^:]+:/,"",email); sub(/:[^:]+$/,"",email) }
email in tgts
' file2 file1
./j/r:franky@list.ru:Test2
./j/d:jdmq77@hotmail.com:Test3
It doesn't produce the expected output because I think having the invalid email address willow@gmail.com@gmail.com
present in file1 and match willow@gmail.com
from file2 is probably a typo in the question.
答案4
得分: 0
两者基本上是做相同的事情,只是在语法上有细微的变化。
-
第一个是通过
"short-circuit"
布尔AND &&
和OR ||
运算符实现的。 -
第二个是相同的概念,但是使用
if-(?)-then-(:)-else
三元操作符实现。
> gawk 'FNR < NR && $2 in __ || __[$_]
FS=:
> mawk -F: 'FNR < NR ? $2 in __ : __[$_]
<( printf '%s'
'willow@gmail.com
franky@list.ru
jdmq77@hotmail.com
sebastianmenendez@hotmail.com' )
<( printf '%s'
'./j/n:jwillow@gmail.com:Test1
./n/o:nanofranky@list.ru:Test2
./j/r:franky@list.ru:Test2
./j/d:jdmq77@hotmail.com:Test3
./x/s:xsebastianmenendez@hotmail.com:Test4
./r/s:rsebastianmenendez@hotmail.com:Test5
./w/i:willow@gmail.com:Test6' )
1 ./j/r:franky@list.ru:Test2
2 ./j/d:jdmq77@hotmail.com:Test3
3 ./w/i:willow@gmail.com:Test6
英文:
both does basically the same thing, with minor variation in syntax
-
1st one via
"short-circuit"
boolean
AND &&
andOR ||
-
2nd one is same concept but via the
if-(?)-then-(:)-else
ternary operator instead
> gawk 'FNR < NR && $2 in __ || __[$]' FS=:
> mawk -F: 'FNR < NR ? $2 in __ : __[$]'
<( printf '%s'
'willow@gmail.com
franky@list.ru
jdmq77@hotmail.com
sebastianmenendez@hotmail.com' )
<( printf '%s'
'./j/n:jwillow@gmail.com:Test1
./n/o:nanofranky@list.ru:Test2
./j/r:franky@list.ru:Test2
./j/d:jdmq77@hotmail.com:Test3
./x/s:xsebastianmenendez@hotmail.com:Test4
./r/s:rsebastianmenendez@hotmail.com:Test5
./w/i:willow@gmail.com:Test6' )
1 ./j/r:franky@list.ru:Test2
2 ./j/d:jdmq77@hotmail.com:Test3
3 ./w/i:willow@gmail.com:Test6
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论