Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Grep$value`Grep$value2`<;命令>;``-嵌套grep?_Bash_Grep_Nested - Fatal编程技术网

Bash Grep$value`Grep$value2`<;命令>;``-嵌套grep?

Bash Grep$value`Grep$value2`<;命令>;``-嵌套grep?,bash,grep,nested,Bash,Grep,Nested,我在awk/sed是个彻头彻尾的笨蛋,所以如果我遗漏了一些明显的东西,请原谅我 基本上,我尝试做一个嵌套的grep,即类似于: grep $value `exim -Mvh $(`exim -bpru | grep $eximID | more`)` 细分: grep $value IN COMMAND --> exim -Mvh (print exim mail headers) FROM RESULTS OF ---> exim -bpru | grep $exim

我在awk/sed是个彻头彻尾的笨蛋,所以如果我遗漏了一些明显的东西,请原谅我

基本上,我尝试做一个嵌套的grep,即类似于:

grep $value `exim -Mvh $(`exim -bpru | grep $eximID | more`)`
细分:

grep $value IN COMMAND 
--> exim -Mvh (print exim mail headers) FROM RESULTS OF 
    ---> exim -bpru | grep $eximID | more
  • $value
    是我要查找的字符串
  • $eximID
    是我在exim-bpru中查找的字符串(列出所有exim内容)
不知道我想用awk/sed完成的事情是否会更容易,因此这个问题确实存在

我试图使它尽可能清晰,但嵌套嵌套是困难的

编辑 塔达!多亏了你们,我的脚本现在可以运行了!在这里,它是未完成的,但工作:

#!/usr/bin/bash

    echo "Enter the email address you want to search for + compare sender info via exim IDs."
    read searchTarget
    echo "Enter the target domain the email is coming from."
    read searchDomain

    #domanList is array for list of exim IDs needed
    domainList=($(exim -bpru | grep "$searchDomain" | awk '{ print $3 }'))


    for i in "${domainList[@]}"
            do
                    echo "$(exim -Mvh  $i | grep $searchTarget)"
                    #echo "$(grep $searchTarget $(exim -Mvh $i))"
            done
这是不对的。backticks(
`command`
)和
$(command)
做了同样的事情,它只是一种替代语法。使用
$()
的优点是它更易于嵌套,因此始终使用它是一个好习惯

那么,让我们来解决这个问题,我们现在以:

grep "$value" "$(exim -Mvh "$(exim -bpru | grep "$eximID")")" | more
我重新定位了
more
命令,原因很明显
more
只是为用户分页数据,将
more
的输出提供给其他内容几乎毫无意义

我还引用了变量,这也是一个好习惯,因为如果变量中有某些字符(最常见的是a空格),那么情况就会发生变化


我无法测试这是否提供了您想要的输出,如果没有,则使用几行示例数据和预期输出更新您的答案。

如果要使用反引号(不推荐;这是一项艰巨的工作),则您必须编写:

grep $value `exim -Mvh $(\`exim -bpru | grep $eximID\`)`
(在这里,我删除了
more
,因为这样使用时,它的行为类似于
cat
,在这样的命令末尾使用
cat
也没有意义)

在整个过程中使用
$(…)
符号更明智:

grep $value $(exim -Mvh $( $(exim -bpru | grep $eximID)))
更合理的是,你不需要太多的间接操作,这就是你真正想要的:

grep $value $(exim -Mvh $(exim -bpru | grep $eximID))
你应该看看:


毫无疑问,还有其他相关的问题。

很难解释你所问的问题——举一些例子就好了。例如,向我们展示一些示例数据以及所需的输出是什么。也许可以使用管道执行您想要的操作。正如:
grep foo*| grep-v“需要忽略的东西”| grep-i potatoe
我认为它需要一个右括号)因为它们不是matching@user3317140是的,修好了。非常感谢。回答得好!最后一个问题。。。。为什么我试图纠正的剧本给了我:“grep:Only:无此文件或目录grep:one:无此文件或目录grep:message:无此文件或目录grep:can:无此文件或目录grep:be:无此文件或目录grep:list:无此文件或目录grep:at:无此文件或目录grep:one:无此文件或目录“编辑-在这之前的30秒里,我一直有‘eurika’的感觉,”@nom您的命令实际上看起来像:
grep“$value”filename
,其中
filename
是整个
$()
命令替换,从脚本判断,这不是您想要的。我不太确定您的
exim
命令输出的是什么,但您可能希望将grep添加到末尾,就像这样:
exim-Mvh$(exim-bpru | grep“$searchDomain”)| grep“$searchTarget”
…请注意,exim希望如何通过ID显示主题的标题是一个问题。现在创建一个for循环来“单独”显示它们-编辑-足够有趣的是,在末尾添加grep不会返回任何内容,甚至不会返回错误:exim-Mvh$(exim-bpru | grep“$searchDomain”| awk“{print$3}”)| grep“$searchTarget”
grep $value $(exim -Mvh $(exim -bpru | grep $eximID))