【问题标题】:Bash - Piping output of command into while loopBash - 将命令的输出通过管道传输到 while 循环中
【发布时间】:2018-01-25 01:54:11
【问题描述】:

我正在编写一个 Bash 脚本,我需要在其中查看命令的输出并根据该输出执行某些操作。为清楚起见,此命令将输出几百万行文本,并且可能需要大约一个小时左右的时间。

目前,我正在执行该命令并将其传送到一个 while 循环中,该循环一次读取一行,然后查找某些条件。如果该标准存在,则更新 .dat 文件并重新打印屏幕。下面是脚本的 sn-p。

eval "$command"| while read line ; do
    if grep -Fq "Specific :: Criterion"; then
        #pull the sixth word from the line which will have the data I need
        temp=$(echo "$line" | awk '{ printf $6 }')
        #sanity check the data
        echo "\$line = $line"
        echo "\$temp = $temp"

        #then push $temp through a case statement that does what I need it to do.
    fi
done

所以问题来了,对数据的完整性检查显示出奇怪的结果。它正在打印不包含 grep 条件的行。

为了确保我的 grep 语句正常工作,我对包含命令输出的文本记录的日志文件进行 grep,它只输出包含指定条件的行。

我对 Bash 还很陌生,所以我不确定发生了什么。可能是该命令在处理满足 grep 条件的 $line 之前强制为 while 循环提供一个新的 $line 吗?

任何想法将不胜感激!

【问题讨论】:

  • eval "$command" 应该只是 $command。此处无需使用eval
  • 如果您没有将输入传递给grep,它将从标准输入读取。这意味着它将在循环的第一次迭代中消耗整个输出。
  • 我最初只有“$command”,但它不能正常工作,所以我做了一些谷歌搜索并添加了 eval,它开始正常运行。我不确定 eval 的作用,但它解决了问题。
  • 没有引号,只有$command。当您不确定他们在做什么时,不要执行命令。
  • hek2mgl 所说的适用于所有命令,尤其是eval

标签: linux bash shell while-loop pipe


【解决方案1】:

grep 如何知道行的样子?

if ( printf '%s\n' "$line" | grep -Fq "Specific :: Criterion"); then

但我不禁觉得你过于复杂了。

function process() { 
    echo "I can do anything I want"
    echo " per element $1"
    echo " that I want here"
}

export -f process

$command | grep -F "Specific :: Criterion" | awk '{print $6}' | xargs -I % -n 1 bash -c "process %";

运行命令,只过滤匹配的行,然后拉出第六个元素。然后,如果您需要在其上运行任意代码,请通过 xargs 将其发送到函数(导出以使其在子进程中可见)。

【讨论】:

  • 是的,做到了。哦,伙计,这很尴尬。我应该删除这个问题吗?
  • 我认为这是一个很好的问题
  • 我明白你在 xargs 之前所说的一切。我对此并不熟悉。我会阅读并查看它是否是一个更简单的解决方案。谢谢!
【解决方案2】:

你在什么上应用 grep?

修改

if grep -Fq "Specific :: Criterion"; then

如下

if ( echo $line | grep -Fq "Specific :: Criterion" ); then

【讨论】:

  • 为什么要重复这个答案? stackoverflow.com/a/45721856/171318
  • 糟糕!当我完成输入答案时,您已经回答了!我正在使用堆栈溢出 Android 应用程序.. 不幸的是它没有刷新
  • 我明白了。我在想类似的事情。这就是我问的原因。 ;)
猜你喜欢
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2012-02-29
相关资源
最近更新 更多