将grep传递给bash中的变量

new*_*.my 12 linux bash grep

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

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

this is third test
Run Code Online (Sandbox Code Playgroud)

我想通过使用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
Run Code Online (Sandbox Code Playgroud)

但我无法运行此脚本.当我在bash中手动运行此命令时,我可以获取电子邮件地址:

echo $var1 | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'
Run Code Online (Sandbox Code Playgroud)

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

fle*_*esk 17

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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


小智 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).
Run Code Online (Sandbox Code Playgroud)

你需要做这样的事情:

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

甚至

var2=$(awk 'NR==2' $file | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')
Run Code Online (Sandbox Code Playgroud)