Live Linux grep скрипт - печатать только положительные результаты - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь кодировать скрипт bash 4 (или sh, если это возможно), который выполняет следующее: 1-й параметр: путь к сжатым модулям для поиска, может быть "."2-й шаблон поиска для поиска

Сценарий до сих пор выглядит следующим образом (имейте в виду, что он не является надежным, он не проверяет, действительны ли оба параметра, он даже не проверяет, заданы ли вообще 2 параметра,все, что я бы добавил, если бы заставил скрипт работать так, как я хочу)

#!/bin/bash
for module in $(find $1 -type f -name "*.xzm"); do
    echo $module
    lsxzm $module | grep "$2"
done

lsxzm - это скрипт, который перечисляет содержимое сжатого живого модуля Linux.Теперь возможный результат для такого поиска будет выглядеть следующим образом (давайте рассмотрим, что я сохранил скрипт как «/ usr / local / bin / lsxzmgrep» и сделал его исполняемым):

/porteus/base# lsxzmgrep . libtiff.so.3
./000-kernel.xzm
./001-core.xzm
/usr/lib64/libtiff.so.3
/usr/lib64/libtiff.so.3.9.7
./001-de-core_locales.xzm
./002-xorg.xzm
./003-xfce.xzm
./010-nvidia-304.137-k.4.16.3-x86_64-don.xzm

Я бы хотелиметь только этот вывод:

/porteus/base# lsxzmgrep . libtiff.so.3
./001-core.xzm
/usr/lib64/libtiff.so.3
/usr/lib64/libtiff.so.3.9.7

Как это можно сделать?Все, что я могу придумать, это временно буферизировать вывод каждой команды grep из цикла for do done и печатать его вместе с именем модуля только тогда, когда grep что-то нашел, что было сделано путем проверки $?grep.

Но это было бы не слишком элегантное решение.

Теперь мне интересно, является ли сценарий оболочки, особенно для bash 4, способным получить тот же результат без необходимости буферизациирезультат grep и проверка возвращаемого значения команды grep, чтобы получить тот же результат: выводить имя модуля и список имен файлов только в том случае, если команда grep действительно что-то нашла?

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Сначала вы должны получить результаты grep, а затем распечатать данные:

#!/bin/bash
for module in $(find $1 -type f -name "*.xzm"); do
    result=$(lsxzm $module | grep "$2")
    if [ $? -eq 0 ]; then
        # grep returned OK, write out results
        echo $module
        echo "$result"
    fi
done

Для этого выходные данные grep сохраняются в переменной «result».Статус выхода проверяется;если это 0 (хорошо), то grep преуспел (в поиске строки поиска), поэтому данные выводятся на печать.

0 голосов
/ 25 декабря 2018

Вы хотите отобразить модуль, только когда grep что-то возвращает.

for module in $(find $1 -type f -name "*.xzm"); do
    lsxzm ${module} | grep "$2" | sed -r "s#.+#${module}\n&#"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...