2016-09-29 3 views
-1

Я пишу скрипт bash, чтобы проверить, находится ли элемент массива в файле.Проверьте, есть ли элемент массива в файле

Например:

У меня есть массив ошибок errors=("1234" "5678" "9999")

У меня есть файл, который содержит шаблоны строк

123400 452612 9999A0 1010EB

Я ищу петлю над файлом, который содержит ошибки и проверить, соответствует ли какой-либо элемент массива любому шаблону строки в файле. Если это так, верните мне точный массив, который он сопоставил в файле для дальнейшей обработки.

Любые идеи о том, как я могу это сделать?

+0

В файле есть кратким строкам? (или) только одна строка с этими фиксированными шаблонами? – Inian

+0

Могут ли ошибки появляться в любом месте файла? –

+0

Ошибки могут появляться в любом месте файла. Файл содержит несколько строк, у которых нет фиксированной длины. –

ответ

1

Сценарий идет как это,

#/bin/bash 
errors=("1234" "5678" "9999") 

for error in "${errors[@]}" 
do 
    grep -o "$error" file 
done 

Для файла образца

$ cat file 
123400 452612 9999A0 1010EB 

Скрипт производит вывод

$ ./script.sh 
1234 
9999 

означает вышеуказанные два ключа из массива имеют в файле. Флаг -o в grep предназначен для идентификации только совпадающих частей из массива. Выдержка из страницы man grep.

-o, --only-matching 
     Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 
+0

Спасибо Inian. Только то, что я ищу –

2

Похоже, вы просто хотите петлю:

for error in "${errors[@]}"; do 
    if grep -qE "(^|)$error(|\$)" file; then 
     # $error was found in the file 
    fi 
done 

Это соответствует ошибке предшествуют в начале строки или пробел, а затем через пробел или конец строки.

Я сделал усилие, чтобы не матча появлений ошибок в подстроках, но если вы не заботитесь, то вы можете изменить команду Grep к этому:

grep -qF "$error" file 

Это вернет успех, если строка ошибок встречается в любом месте строки.

3

Вот способ, где вам нужно только вызвать grep раз:

$ grep -oFf <(printf "%s\n" "${errors[@]}") file 
1234 
9999 

Опция -f это указать файл, который содержит шаблон. Я использую замену процесса, чтобы «содержать» шаблоны, по одному на строку.

Опция -F указывает соответствие текстового текста: я предполагаю, что ваш массив «errors» не будет содержать регулярных выражений.

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