Bash高级grep解决方案

时间:2016-11-26 22:38:21

标签: linux bash shell grep

我的Linux上有一个file.txt,它看起来像以下结构:

file.txt的:

{{obj?.name}}

或仅限姓名条目和电话号码或电子邮件地址

我想在开始时使用grep

full name
E-mail: email@email.com
Phone: 0123456789

full name
email@email.com
01/23456789

full name
e: email@email.com
00-223-445-56
.
.
.
etc

列出文件中的所有电子邮件地址和电话号码。如果file.txt看起来像这样,我怎么能这样做?

5 个答案:

答案 0 :(得分:0)

你可以从这样简单的事情开始:

$.ajax({
    type: "POST",
    url: host + '/status/' + $likeValue + '/like',
    data: {likeValue: $likeValue, _token:$token},
    success: function(res) {

    }
 });

它为您提供了@(所以电子邮件)和所有数字(所以电话号码)。您可以使用更高级的正则表达式来进行更好的搜索(电子邮件和电话号码确实有更严格的规则......)但这就是想法。

答案 1 :(得分:0)

egrep "@|[0-9]"

只匹配包含" @"的行或至少一位数。您的示例说明名称行不包含数字。

答案 2 :(得分:0)

目前尚不清楚您期望哪种格式作为输出。如果你想将电子邮件地址和电话号码分开(这是你想要的吗?连接:电子邮件地址< - >电话号码会有点混乱)你也可以使用(GNU)sed :

sed -n -e '1 {s/\(.*\)/e-mail:\n\1/; P;};' \
       -e '/@/ s/\(.\+[ \\\t]\)\{0,1\}\(.\+\)@\(.\+\)/\t\2\@\3/p;' \          
       -e '/[0-9]\+$/ H; $ {x; s/\n\([^0-9]*\)\([0-9]\+\)/\n\t\2/g; s/\(.*\)/\nphone:\n\1/p;}'
       file.txt

答案 3 :(得分:0)

你真的想使用grep,或者你只是使用短语“use grep”来表示“过滤”。假设后者(因为grep是错误的工具),并假设每条记录在第二行的最后一列中有一个电子邮件地址,在第三行的最后一列中有一个电话号码,并且每条记录都由一行没有多余的空格分隔,你可以这样做:

 <file.txt awk '{print $NF}' | awk '{print $2,$3}' FS='\n' RS=

您可以使用单个awk调用来执行此操作,但这更简单且可能已足够。

答案 4 :(得分:0)

这是awk的工作,而不是grep:

$ awk '(NR%4)~/^[23]$/{print $NF}' file
email@email.com
0123456789
email@email.com
01/23456789
email@email.com
00-223-445-56

$ awk '(NR%4)~/^[23]$/{printf "%s%s", $NF, (++c%2?OFS:ORS)}' file
email@email.com 0123456789
email@email.com 01/23456789
email@email.com 00-223-445-56

$ awk '(NR%4)==2{print $NF}' file
email@email.com
email@email.com
email@email.com

$ awk '(NR%4)==3{print $NF}' file
0123456789
01/23456789
00-223-445-56

接受你的选择,这一切都是微不足道的......