2016-10-08 2 views
2

Ниже приведен скрипт, чтобы найти в файле определенный массив разных слов «боты, шпионские программы, вирусы», если файл существует.Использование grep в массиве

#!/bin/bash 

#strings to find in file 
NAME[0]="bots" 
NAME[1]="spyware" 
NAME[2]="virus" 

#location of file 
LOGS=/home/testing.txt 

#define function to grep any of the above mentioned array strings in file 
func(){ 
if `grep "${NAME[*]}" $LOGS`; then 
echo "CRITICAL: ${NAME[*]}" 
else 
echo "errors not found" 
exit 
fi 
} 

#file exist or not exist 
if [ -f $LOGS ]; then 
    echo " File Found" 

    #call functions 
    func 
    modified 

    else 
    echo "File Not Found" 
    exit 

Но grep "${NAME[*]}" $LOGS не работает. Ниже показана ошибка:

grep: virus: No such file or directory 
grep: bots: No such file or directory 
+1

научиться использовать 'set -x' для включения трассировки отладки сценария оболочки (' set + x' отключить). И вы обнаружите, что вам нужно преобразовать ваш arr в цель поиска, которая выглядит как 'grep 'a | b | c' file'. И отличный второй Q, но нам нужно только увидеть код 'func()', поэтому научитесь настраивать Qs на нерабочий код. Удачи. – shellter

ответ

2

Вот решение проблемы.

Перейти к if-body, когда grep находит хотя бы одну запись массива KEYWORDS в файле FILE.
Следующий код работает для записей массива со специальными символами, такими как пробел или *.

KEYWORDS[0]="virus" 
KEYWORDS[1]="two words" 
KEYWORDS[2]="special chars .+*?|()[]^&" 

if grep -qF "${KEYWORDS[@]/#/-e}" -- "$FILE"; then 
    # found a keyword 
fi 

Что здесь происходит?

  • grep -q
    ничего не выводите. Выйти в первом матче. Нам не нужно сканировать полный файл, если мы уже нашли ключевое слово.

  • grep -F
    Поиск фиксированных строк. Такие персонажи, как *, |, или + теряют свое особое значение.

  • "{KEYWORDS[@]}"
    Каждая запись массива расширяется до одной строки. Здесь "virus" "two words" "special chars .+*?|()[]^&"

  • "${KEYWORDS[@]/#/-e}"
    Prepend -e каждой записи массива. Используя этот параметр, Grep может искать несколько шаблонов. grep -e"FirstPattern" -e"SecondPattern" ...

  • grep Pattern -- "$FILE"
    The -- намек, что "$FILE" следует интерпретировать как имя файла. Его можно назвать файлом -eFunny, который остановит наш скрипт, потому что grep подумает, что имя файла не было предоставлено и будет ждать ввода из stdin. Это не очень важно здесь, но хорошая привычка к установлению. Так называемая двойная черточка доступна для большинства команд, а не только для grep.

+0

спасибо, что сработало для меня. – blaCkninJa

Смежные вопросы