Команда выполнения на основе вывода другой команды

В grep регулярном выражении, [ специальный символ. Для литерала [, Вы должны к обратной косой черте выйти из него, как так: \[.

Обратите внимание что полнота Nov 22 [0-9]: ... [10.50.98.68 регулярное выражение. Вы не можете только указать на него и сказать, что "эта часть является regex, эта часть должна быть литеральной строкой" и ожидать grep смочь считать Ваши мысли. Вот почему необходимо выйти из любых специальных символов, которые являются частью литеральных строк, которым Вы хотите соответствовать.


Не связанный, но каждое возникновение [0-9] в Вашем регулярном выражении только соответствует отдельному символу. Кроме того, . специальный символ, которого должны будут оставить также. Вы, вероятно, хотите что-то как следующее для Вашего регулярного выражения:

^Nov 22 [0-9][0-9]:[0-9][0-9]:[0-9][0-9] Received Packet from \[10\.50\.98\.68

3
14.07.2014, 16:04
1 ответ

Сначала заметка о стиле. Использование цикла for для итераций по строкам вывода редко является хорошей идеей. Цикл for разбивает свой вход на пробелы, так что если у вас больше одного слова на строку, то оно разбивает каждое слово на разные переменные. Вместо этого следует использовать , а , так как это более изящно работает с пробелами. Также, обычно предпочтительнее использовать $(command) вместо `command`.

Хотя, вероятно, это не ваша проблема. Главная проблема в том, что вы перекликаетесь с результатами lsvgfs ${LINE} для каждой строки результатов lsvgfs ${LINE}:

for LINE2 in `lsvgfs ${LINE}` ; do
        echo "`lsvgfs ${LINE}` \n"
done

Так что, конечно, вы получаете эти строки дважды:

/
/usr

Попробуйте вместо этого:

lsvg | while read LINE; do
    echo "Volume Group: ${LINE}"
    lsvgfs "${LINE}" | while read LINE2; do
        echo "File System: ${LINE2}"
        df -g ${LINE2}
    done
echo ""
done
2
27.01.2020, 21:28

Теги

Похожие вопросы