【问题标题】:passing grep into a variable in bash将 grep 传递给 bash 中的变量
【发布时间】:2012-06-12 08:15:28
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试过echo $file 以确保myscript 确实返回了email.txt 中的内容?
  • @flesk yup..我已经这样做了。$file 有我想要 grep 的确切行和内容,它可以毫无问题地回显
  • 如果From: 行不在第 2 行:awk -F : '$1 == "From" {print $2; exit}' "$file"

标签: linux bash grep


【解决方案1】:

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

#!/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 周围的附加括号是多余的。

【讨论】:

  • 当使用这个解决方案时它不会给我任何错误但是当我回显 $var2 时它也不会给我输出
  • @newbie.my:在$var1 周围添加了双引号。
  • 我太傻了。你的解决方案正在运行。因为我在我的机器上使用了不同的变量,所以变量名应该改变。无论如何感谢代码!
【解决方案2】:

发生了什么是这样的:

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

【讨论】:

    【解决方案3】:

    对于 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
    

    【讨论】:

    • 我已经尝试过你的解决方案。但它不起作用。顺便说一下,我的 grep 有 -o 标志。它只显示与模式匹配的部分
    【解决方案4】:

    使用Bash parameter expansion

    var2="${var1#*:}"
    

    【讨论】:

    • 这不是命令替换,命令替换是 $(command)。您所展示的是一种参数扩展形式(有很多)。您正在删除左侧以 ':' 结尾的最短字符串
    【解决方案5】:

    有一个更粗略的方法:

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

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

    根据需要细化...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 2013-09-09
      • 2013-04-20
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多