将grep传递给bash中的变量

时间:2012-06-12 08:15:28

标签: linux bash grep

我有一个名为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'

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

5 个答案:

答案 0 :(得分:16)

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

#!/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任何有用的内容。 <{1}}附近的附加括号是多余的。

答案 1 :(得分:9)

这是怎么回事:

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')

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用Bash parameter expansion

var2="${var1#*:}"

答案 4 :(得分:0)

有一种比较粗糙的方式:

cat $ file | grep @ | tr'&lt;&gt;' '\ 012 \ 012'| grep @

也就是说,使用@符号提取行[s],将尖括号转换为换行符,然后再次使用@符号留下grep。

根据需要进行优化......