Строка поиска в текстовом файле и выполняет сценарий в зависимости от результата

Я считаю, что это сделает то, что вам нужно. Он просматривает каждый каталог в свою очередь и проверяет, что нет «недавно измененных» файлов.

find * -type d |
    while read DIR
    do
        LINES=$(find "$DIR" -maxdepth 1 -type f -mtime -5 -print -quit)
        test -z "$LINES" && echo "$DIR NOT RECENTLY MODIFIED"
    done

Если найдут ... -MaxDepth 1 не работает для вашей ситуации, не стесняйтесь изменить его на что-то вроде этого

LINES=$(find "$DIR" \( -type d -prune \) -o \( -type f -mtime -5 -print -quit \))

, и если вы хотите считать количество элементов, недавно измененных (или если -Quit не доступен), это будет работать

LINES=$(find "$DIR" -maxdepth 1 -type f -mtime -5 | wc -l | tr -d' ')
test 0 -eq "$LINES" && echo "$DIR NOT RECENTLY MODIFIED" || echo "$DIR has $LINES recent file(s)"
0
31.10.2014, 19:54
1 ответ

Вы можете сделать это в Perl:

$ perl -lne 'if(/A=([^\s]+)/){print "A : $1"; `scriptA.sh`} 
           if(/B=([^\s]+)/){print "B : $1"; `scriptB.sh`}' Data.txt

Explanation

  • -lne : удаляйте новые строки из каждой входной строки и добавляйте новую строку к каждому вызову print (-l); читайте файл построчно (-n) и запускайте скрипт, заданный -e в каждой строке.
  • if(/A=([^\s]+)/){выведите "A : $1"; `scriptA.sh`} : если эта строка что-то соответствует A= , выведите A : что-то (круглые скобки означают, что шаблон захвачен и теперь сохранен как $1) , затем запустите scriptA.
  • if(/B=([^\s]+)/){печать "B : $1"; `scriptB.sh`} : как выше, но для B.

Или вы можете просто извлечь значения и разобрать их:

$ grep -Po '[AB]=[^\s]+' Data.txt | 
    while IFS="=" read name val; do 
        echo "$name=$val"; 
        [ "$name" = "A" ] && scriptA.sh || scriptB.sh; 
    done

Объяснение

  • grep -Po '[AB]=[^\s]+' Data. txt : -P включает PCRE, а -o приведет к тому, что grep выведет каждое совпадение на отдельную строку. Символ [AB]=[^\s]+ означает "соответствие A или B, затем =, после чего как можно больше небелого пробела. Выводом этого является полная коллекция A=foo и B=bar из вашего входного файла, каждый из которых в своей строке.
  • а IFS="=" считываем имя val : установите разделитель ионных полей на = и считываем две переменные. Это означает, что $name будет A или B, а $value будет значением, связанным с ними.
  • echo "$name=$val"; : распечатайте их, измените формат на любой.
  • ["$name" = "A" ] && scriptA.sh || scriptB.sh; : если $name это A, запустите scriptA.sh, в противном случае запустите scriptB.sh. Оба вышеприведенных решения предполагают, что вызываемые вами скрипты являются scriptA.sh и scriptB.sh, и что они находятся в вашем $PATH. Редактируйте соответственно.
1
28.01.2020, 02:51

Теги

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