上一次bash循环迭代到下一次迭代的输出,以变化grep命令

时间:2018-10-26 00:22:55

标签: bash grep

我要从一个for循环的一个迭代中获取grep命令的输出,并在下一个迭代中将其转换为下一个grep命令的输入。

通常,我将使用数组和for循环来构建单个grep命令,但是由于我需要bash变量GREP_COLOR来在两次迭代之间进行切换,因此我遇到了这个问题。我想我可以做三个不同的函数,除了那个变量外,它们都做同样的事情,但是我更愿意有一个函数。这是数组:

patterns=("general-red" "general-yellow" "general-green" "ha-red" "ha-yellow" "ha-green")

功能如下:

function iterate-patterns() {
    for i in "${patterns[@]}"
    do
            if [[ "$i" = *-red ]]
            then
                    GREP_COLOR="$RED" grep -E --text --color=always --line-buffered -f /var/lib/foobar/"${i}".txt
            elif [[ "$i" = *-yellow ]]
            then
                    GREP_COLOR="$YELLOW" grep -E --text --color=always --line-buffered -f /var/lib/foobar/"${i}".txt
            elif [[ "$i" = *-green ]]
            then
                    GREP_COLOR="$GREEN" grep -E --text --color=always --line-buffered -f /var/lib/foobar/"${i}".txt 
            else
                    cat 
            fi
    done
}

这里是调用该函数的函数,提供初始输入:

function daddyfunction() {

    iterate-filters |\
    iterate-experimental |\
    iterate-patterns 
}

从本质上讲,数组中的每个项目都代表grep -f命令的文件,其中包含许多要搜索的图案并以所需的颜色突出显示。但是,按照当前的代码显示,只有第一个数组项最终被显示。我可以肯定地说是因为每个grep需要以某种方式更改为以下迭代的grep命令的输入。

这可行吗?我会为每种颜色制作函数吗?有没有更好的方法来完成所有这些工作?我寻求互联网的智慧。 ;)请,谢谢。

编辑

仅需确认,三个独立的功能确实起作用:

function iterate-redhighlights() {
    greplist=()
    for i in "${redpatterns[@]}"
    do
            if [[ "$i" = *-red ]]
            then
                    greplist+=( -f /var/lib/foobar/"${i}".txt)
            else
                    cat
            fi
    done
    GREP_COLOR="$RED" $search "${greplist[@]}"
}
function iterate-yellowhighlights() {
    greplist=()
    for i in "${yellowpatterns[@]}"
    do
            if [[ "$i" = *-yellow ]]
            then
                    greplist+=( -f /var/lib/foobar/"${i}".txt)
            else
                    cat
            fi
    done
    GREP_COLOR="$YELLOW" $search "${greplist[@]}"
}
function iterate-greenhighlights() {
    greplist=()
    for i in "${greenpatterns[@]}"
    do
            if [[ "$i" = *-green ]]
            then
                    greplist+=( -f /var/lib/foobar/"${i}".txt)
            else
                    cat
            fi
    done
    GREP_COLOR="$GREEN" $search "${greplist[@]}"
}

1 个答案:

答案 0 :(得分:1)

def self_post(): # try: # post = reddit.subreddit(sub_reddit).submit(title=post_title, selftext=post_body) # reddit.subreddit(sub_reddit).flair.set('bboe', '') sub=reddit.subreddit(sub_reddit) post = sub.submit(title=post_title, selftext=post_body, flair_id='bboe', flair_text='bahissiteleri flair') 读取grep时,您无法循环运行。第一次迭代将读取stdin的所有内容,并且无法退回到下一次迭代的开始(文件支持查找,但管道不支持查找,并且没有shell语法可以做到)。

您可以在循环之前将所有stdin复制到一个临时文件,然后每次处理该文件。将输出重定向到另一个临时文件,然后将其复制回输入文件以准备下一次迭代。

stdin