首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash - Piping命令输出到while循环中

Bash - Piping命令输出到while循环中
EN

Stack Overflow用户
提问于 2017-08-17 03:41:11
回答 2查看 2.3K关注 0票数 0

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

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

代码语言:javascript
复制
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的新手,所以我不确定发生了什么。在while循环可以处理满足grep标准的$line之前,该命令会强制向它提供一个新的$line吗?

任何想法都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-17 03:48:43

grep如何知道行是什么样子的?

代码语言:javascript
复制
if ( printf '%s\n' "$line" | grep -Fq "Specific :: Criterion"); then

但我不禁觉得你把事情搞得太复杂了。

代码语言:javascript
复制
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将其发送到一个函数(您可以将其导出以使其在子进程中可见)。

票数 2
EN

Stack Overflow用户

发布于 2017-08-17 03:53:06

您要将grep应用于什么?

修改

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

如下所示

代码语言:javascript
复制
if ( echo $line | grep -Fq "Specific :: Criterion" ); then
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45721734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档