18

我有一个名为 email.txt 的文件,如下所示:

Subject:My test
From:my email <myemail@gmail.com>

this is third test

我想使用 bash 脚本只取出这个文件中的电子邮件地址。所以我把这个脚本放在名为 myscript 的 bash 脚本中:

#!/bin/bash

file=$(myscript)

var1=$(awk 'NR==2' $file)

var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'))

echo $var2

但是我没有运行这个脚本。当我在 bash 中手动运行这个命令时,我可以获得电子邮件地址:

echo $var1 | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'

我需要将电子邮件地址存储在一个变量中,以便我可以在其他功能中使用它。有人可以告诉我如何解决这个问题吗?谢谢。

4

5 回答 5

25

我认为这是一种过于复杂的处理方式,但如果你只是想让你的脚本工作,试试这个:

#!/bin/bash

file="email.txt"

var1=$(awk 'NR==2' $file)

var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')

echo $var2

我不确定file=$(myscript)应该做什么,但在下一行你想要一个文件名作为 的参数awk,所以你应该只将email.txt字符串值分配给file,而不是执行一个名为myscript. $var1不是命令(它只是文本文件中的一行),所以你必须给echo它提供grep任何有用的东西。周围的附加括号grep是多余的。

于 2012-06-12T08:34:01.933 回答
11

正在发生的事情是这样的:

var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'))
       ^^^^^^^ Execute the program named (what is in variable var1).

你需要做这样的事情:

var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')

甚至

var2=$(awk 'NR==2' $file | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')
于 2012-06-12T08:29:45.167 回答
1

bash 有非常有用的标志:-xv

该行与

var2=$("$var1" | (grep...

应该

var2=$(echo "$var1" | (grep...

我的 grep 版本也没有 -o 标志。

而且,即使在以下代码运行时 grep 模式是“贪婪的”,它的输出也不完全是您想要的。

#!/bin/bash -xv
file=test.txt
var1=$(awk 'NR==2' $file)

var2=$(echo "$var1" | (grep -Ei '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b'))

echo $var2
于 2012-06-12T08:32:15.900 回答
0

使用Bash parameter expansion,

var2="${var1#*:}"
于 2012-06-12T09:14:44.927 回答
0

有一个更粗暴的方法:

cat $file | grep @ | tr '<>' '\012\012' | grep @

也就是说,提取带有@ 符号的行,将尖括号转换为换行符,然后再次使用grep 查找带有@ 符号的任何内容。

根据需要细化...

于 2015-02-26T15:00:45.383 回答