Сценарий оболочки: если строка присутствует в файле

#shell #scripting

#оболочка #сценарии

Вопрос:

Я новичок в написании сценариев оболочки и хочу проверить, присутствуют ли в файле 3 строки («привет», «кто», «когда» и т.д.).
Я нахожу много способов, когда я гуглю awk, cat, grep и т.д., Какой может быть лучший способ и как я могу это сделать.
Мне просто нужно знать, присутствуют строки или нет.

Ответ №1:

Ваш вопрос немного неполон:

  • вы хотите найти строки или слова? Итак, когда появляется слово Othello , считается ли это как hello ?
  • в вашем вопросе есть пробел позади when . Это намеренно?
  • вы хотите знать, есть ли в файле все три слова или одного из слов достаточно?

Общее решение заключается в использовании grep или egrep для поиска текста в файле. Точная командная строка зависит от ответов на приведенные выше вопросы.

  • для поиска слов ( Othello не считается как hello ) вам нужно передать -w опцию grep.
  • Я предполагаю, что пробел был ошибкой.

Когда вам нужны все слова, вы можете сделать egrep -wo 'hello|who|when' | sort -u . egrep Команда находит все экземпляры заданных слов и выводит их по одному в строке. На этом этапе у вас будет много дубликатов. Поэтому sort -u команда сортирует их и сохраняет только уникальные строки (вот что -u означает). В полной программе я бы сделал это следующим образом:

 filename="story.txt"
words=$(egrep -wo 'hello|who|when' "$filename" | sort -u)
n=$(echo "$words" | wc -l)
if [ $n = 3 ]; then
  echo "found all words in the file"
else
  echo "didn't find all words, only ""$words""."
fi
  

Я мог бы рассказать вам гораздо больше об этом небольшом фрагменте кода и о том, почему я написал его именно так, но для новичка этого уже достаточно, чтобы понять.

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

 filename="story.txt"
if egrep -wl 'hello' "$filename" 1>/dev/null; then
  if egrep -wl 'when' "$filename" 1>/dev/null; then
    if egrep -wl 'who' "$filename" 1>/dev/null; then
      echo "found all three words"
    fi
  fi
fi
  

[Обновить:]

Этот второй фрагмент кода также проверяет, содержит ли данный файл все три слова. Каждое из if предложений проверяет наличие одного из слов. Опция -l (в нижнем регистре ell) на egrep делает это потенциально быстрее, но вам, вероятно, эта опция вообще не нужна.

Обычно egrep печатаются все строки, которые соответствуют заданным выражениям (в данном случае вашим трем словам). Поскольку нам не нужен этот вывод, мы перенаправляем его с помощью оператора arrow > в специальный файл с именем /dev/null . Все, что вы записываете в этот файл, отбрасывается.

if Инструкция принимает другую команду в качестве своего аргумента, и если эта команда возвращается успешно, then ветвь принимается. Приятная особенность egrep команды заключается в том, что она успешно возвращает результат, если данное выражение поиска содержится в файле, так что эти две вещи идеально сочетаются друг с другом.

Для дальнейшего чтения вам следует обратиться к справочной документации с веб-сайта Open Group: http://www.google.com/search ?q=opengroup grep

Комментарии:

1. Спасибо за подробную информацию .. это очень помогает.. Мне нужны слова и пробел после «когда» был случайным, я хочу знать, все ли три слова там, тогда только я хочу выполнить некоторую обработку, но я не понял, в чем разница между вашими двумя подходами, и, пожалуйста, пролейте немного света на второй подход, как вы сделали для первого, большое спасибо

2. Также что означает -wo в egrep -wo for.is это egrep -w?

3. -wo Опция является сокращением для двух опций -w -o . -w Опция позволяет находить слова вместо подстрок , и -o опция выводит только текст, соответствующий поисковому выражению, а не всю строку, в которой был найден текст. (Но я только что увидел, что оба этих параметра не гарантированы POSIX, поэтому вам нужно проверить, поддерживает ли их ваша система. В Linux так и есть.)