Вывод предыдущей итерации цикла bash в следующую итерацию для различных команд grep - PullRequest
0 голосов
/ 26 октября 2018

Я нахожусь в ситуации, когда я хочу взять выходные данные команды grep из одной итерации цикла for и преобразовать их во входные данные для следующей команды 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 голосов
/ 26 октября 2018

Вы не можете запустить grep в цикле, когда он читает из stdin.Первая итерация будет читать все stdin, и нет способа перемотать назад к началу для следующей итерации (файлы поддерживают поиск, но каналы не делают, и для этого нет синтаксиса оболочки).

Вы можете скопировать все stdin во временный файл перед циклом, а затем каждый раз обрабатывать этот файл.Перенаправьте вывод в другой временный файл, затем скопируйте его обратно во входной файл, чтобы подготовиться к следующей итерации.

iterate-patterns() {
    tempfile=$(mktemp /tmp/patterns.XXXXXX)
    tempfile2=$(mktemp /tmp/patterns2.XXXXXX)
    cat > "$tempfile"
    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 "$tempfile" > "$tempfile2"
        elif [[ "$i" = *-yellow ]]
        then
            GREP_COLOR="$YELLOW" grep -E --text --color=always --line-buffered -f /var/lib/foobar/"${i}".txt "$tempfile" > "$tempfile2"
        elif [[ "$i" = *-green ]]
        then
            GREP_COLOR="$GREEN" grep -E --text --color=always --line-buffered -f /var/lib/foobar/"${i}".txt "$tempfile" > "$tempfile2"
        else
            cat "$tempfile" > "$tempfile2"
        fi
        cp "$tempfile2" "$tempfile"
    done
    cat "$tempfile"
    rm "$tempfile" "$tempfile2"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...