我有一个名为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'
我需要将电子邮件地址存储在变量中,以便我可以在其他函数中使用它。有人可以告诉我如何解决这个问题吗? 感谢。
答案 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。
根据需要进行优化......