Вопрос или проблема
У меня есть 3 строки
A='яблоки'
B='бананы'
C='морковка'
Я хочу проверить, существуют ли все они в файле fruit.txt
. Если мне не хватает A
, тогда добавьте A
, если B
, тогда добавьте B
, и так далее.
Вот что у меня сейчас
if grep -qF "$A | $B | $C" fruit.txt;
then echo 'существует'
else
echo 'не существует'
echo $A $B $C >> fruit.txt
fi
В вашем объяснении того, что вы хотите сделать, содержится описание цикла (“если строка не существует, добавьте ее, повторите для всех строк”).
Вы могли бы проверить наличие каждой строки по отдельности в цикле, а затем добавить строку, если она уже не содержится в файле.
fruits=( яблоки бананы морковка )
for fruit in "${fruits[@]}"; do
if grep -q -wF -e "$fruit" fruit.txt; then
printf '%s существует\n' "$fruit"
else
printf '%s не существует\n' "$fruit"
printf '%s\n' "$fruit" >>fruit.txt
fi
done
Здесь я использую массив для строк. Если вы хотите использовать свои переменные $A
, $B
и $C
, тогда установите fruits=( "$A" "$B" "$C" )
или выполните цикл с for fruit in "$A" "$B" "$C"; do ...; done
.
Строго отвечая на ваш вопрос, вы можете сделать это:
grep -lr $1 . | xargs -I{} grep -lr $2 {}
Это найдет файлы, которые содержат $1
И $2
Ответ или решение
Для проверки существования нескольких строк в файле с использованием оболочки (Shell), можно создать скрипт, который сначала определяет, существуют ли данные строки в указанном файле, а затем добавляет недостающие строки. В этой статье мы рассмотрим, как реализовать этот процесс, используя основное программирование в оболочке Bash.
Задача
У вас есть три строки (фрукты):
- A=’apples’
- B=’bananas’
- C=’carrots’
Вам нужно проверить, содержатся ли все они в файле fruit.txt
. Если какой-либо из фруктов отсутствует, необходимо его добавить в файл.
Решение
Идеальный способ решения данной задачи – это использовать массив для хранения фрукти и цикл для проверки каждого элемента массива по отдельности. Давайте рассмотрим пошаговое решение:
- Создание массива: Мы создадим массив, который будет содержать все фрукты.
- Цикл проверки: С помощью цикла
for
проверим наличие каждого фрукта в файле. - Добавление отсутствующих строк: Если фрукт отсутствует, мы добавим его в файл.
Пример скрипта
Вот пример скрипта, который выполняет описанные шаги:
#!/bin/bash
# Определяем строки
A='apples'
B='bananas'
C='carrots'
# Создаем массив с фруктами
fruits=("$A" "$B" "$C")
# Проверяем каждый фрукт
for fruit in "${fruits[@]}"; do
# Проверяем существование фрукта в файле
if grep -q -wF "$fruit" fruit.txt; then
printf '%s существует в файле.\n' "$fruit"
else
printf '%s отсутствует в файле, добавляем...\n' "$fruit"
# Добавляем фрукт в файл
echo "$fruit" >> fruit.txt
fi
done
Объяснение кода
- Объявление переменных: Мы объявляем три строки, представляющие наши фрукты.
- Создание массива: С использованием стандартного синтаксиса Bash мы создаем массив
fruits
, который содержит все три фрукта. - Цикл
for
: Этот цикл проходит по каждому элементу массива и проверяет наличие фрукта в файлеfruit.txt
с помощью командыgrep
.grep -q
: Флаг-q
указывает на тихий (silent) режим, который подавляет вывод.-w
: Этот флаг используется для поиска только целых слов, предотвращая ложные срабатывания.-F
: Этот флаг обозначает фиксированную строку без регулярных выражений.
Если фрукт находится, выводится сообщение о его присутствии. В противном случае, программа сообщит об отсутствии фрукта и добавит его в файл с помощью команды echo
.
Заключение
Данный скрипт является простым и эффективным способом для проверки наличия нескольких строк в файле, добавления недостающих строк и демонстрирует основные прикладные возможности скриптов на Bash. Это решение может быть легко расширено для включения дополнительных строк или модификации для работы с другими файлами. Рассматривая его работу, мы можем извлечь уроки по управлению данными в текстовых файлах с помощью утилит командной строки, что является важным навыком для системных администраторов и разработчиков.