Ваш вопрос не совсем ясен, однако для решения проблем с GRUB вы можете загрузить ISO-образ загрузочного -восстановить -диск , записать его на компакт-диск -ROM или USB-накопитель, затем загрузитесь с этого устройства. Затем следуйте инструкциям.
Использованиеbash
:
#!/bin/bash
files=( 'file 1.txt' 'file 2.txt' 'file 3.txt' )
while IFS= read -r pattern; do
grep -e "$pattern" "${files[0]}"
files=( "${files[@]:1}" )
done <search.patterns
Проверка:
$ bash script.sh
home 3
dog 1
cat 4
Сценарий сохраняет соответствующие имена файлов в массиве files
, а затем переходит к чтению шаблонов из файла search.patterns
. Для каждого шаблона запрашивается первый файл в списке files
. Затем обработанный файл удаляется из списка files
(, что дает новое первое имя файла в списке ).
Если количество паттернов превышает количество файлов в files
, будут ошибки из grep
.
С помощью GNU awk(gawk
)вы можете использовать правило BEGINFILE
для чтения нового шаблона при каждом изменении входного файла:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Вы действительно должны проверить, что getline
возвращает новый шаблон, например
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Обратите внимание, что шаблоны awk
являются расширенными регулярными выражениями, подобными тем, которые поддерживаются grep
с опцией -E
.
Вы можете добиться того же в не -GNU awk
, передав search.patterns
в качестве первого файла и используя соответственно NR
и FNR
либо для чтения шаблонов в индексированном массиве, либо для поиска следующий шаблон в массиве.
Вы можете использовать paste
для сопоставления шаблона с файлом:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Я предполагаю, что имена файлов не содержат табуляции.