Как проверить, существует ли строка в файле с Bash? - PullRequest
290 голосов
/ 20 января 2011

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

my_list.txt:

/tmp
/var/tmp

Я бы хотел проверить Bash перед тем, как добавить имя каталога, если это имя уже существует в файле.

Ответы [ 11 ]

569 голосов
/ 20 января 2011
grep -Fxq "$FILENAME" my_list.txt

Статус выхода равен 0 (true), если имя найдено, 1 (false), если нет, поэтому:

if grep -Fxq "$FILENAME" my_list.txt
then
    # code if found
else
    # code if not found
fi

Здесь приведены соответствующие разделы справочной страницы.для grep:

grep [options] PATTERN [FILE...]

-F, --fixed-strings
       Interpret PATTERN as a list of fixed strings, separated by  new-
       lines, any of which is to be matched.

-x, --line-regexp
       Select only those matches that exactly match the whole line.

-q, --quiet, --silent
       Quiet; do not write anything to standard output.  Exit  immedi-
       ately  with  zero status if any match is found, even if an error
       was detected.  Also see the -s or --no-messages option.
85 голосов
/ 07 января 2013

Относительно следующего решения:

grep -Fxq "$FILENAME" my_list.txt

Если вам интересно (как и я), что означает -Fxq на простом английском языке:

  • F: влияет на интерпретацию PATTERN (фиксированная строка вместо регулярного выражения)
  • x: соответствует всей строке
  • q: Тссс ... минимальная печать

Из файла man:

-F, --fixed-strings
    Interpret  PATTERN  as  a  list of fixed strings, separated by newlines, any of which is to be matched.
    (-F is specified by POSIX.)
-x, --line-regexp
    Select only those matches that exactly match the whole line.  (-x is specified by POSIX.)
-q, --quiet, --silent
    Quiet; do not write anything to standard output.  Exit immediately with zero status  if  any  match  is
          found,  even  if  an error was detected.  Also see the -s or --no-messages option.  (-q is specified by
          POSIX.)
34 голосов
/ 02 ноября 2012

Три метода в моей голове:

1) Краткий тест для имени в пути (я не уверен, что это может быть ваш случай)

ls -a "path" | grep "name"


2) Краткий тест для строки в файле

grep -R "string" "filepath"


3) Более длинный bash-скрипт с использованием регулярных выражений:

#!/bin/bash

declare file="content.txt"
declare regex="\s+string\s+"

declare file_content=$( cat "${file}" )
if [[ " $file_content " =~ $regex ]] # please note the space before and after the file content
    then
        echo "found"
    else
        echo "not found"
fi

exit

Это должно быть быстрее , если у вас есть для проверки нескольких строк в содержимом файла с использованием цикла, например, для изменения регулярного выражения в любом цикле.

16 голосов
/ 12 апреля 2013

Более простой способ:

if grep "$filename" my_list.txt > /dev/null
then
   ... found
else
   ... not found
fi

Подсказка: отправьте на /dev/null, если вы хотите получить статус выхода команды, но не выводите.

7 голосов
/ 06 октября 2017

Самый простой и простой способ будет:

isInFile=$(cat file.txt | grep -c "string")


if [ $isInFile -eq 0 ]; then
   #string not contained in file
else
   #string is in file at least once
fi

grep -c вернет счетчик того, сколько раз строка встречается в файле.

5 голосов
/ 20 января 2011

Если я правильно понял ваш вопрос, это должно сделать то, что вам нужно.

  1. вы можете указать каталог, который вы хотите добавить, через переменную $ check
  2. , если каталогуже в списке, вывод "dir уже в списке"
  3. , если каталог еще не в списке, он добавляется в my_list.txt

В одномлиния : check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt

2 голосов
/ 31 марта 2016
grep -E "(string)" /path/to/file || echo "no match found"
Опция

-E заставляет grep использовать регулярные выражения

2 голосов
/ 11 января 2016

Моя версия с использованием fgrep

  FOUND=`fgrep -c "FOUND" $VALIDATION_FILE`
  if [ $FOUND -eq 0 ]; then
    echo "Not able to find"
  else
    echo "able to find"     
  fi  
2 голосов
/ 29 декабря 2015

Если вы просто хотите проверить наличие одной строки, вам не нужно создавать файл.Например,

if grep -xq "LINE_TO_BE_MATCHED" FILE_TO_LOOK_IN ; then
  # code for if it exists
else
  # code for if it does not exist
fi  
0 голосов
/ 31 августа 2017

Безрецептурное решение, работает для меня:

MY_LIST=$( cat /path/to/my_list.txt )



if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
  echo "It's there!"
else
echo "its not there"
fi

на основе: https://stackoverflow.com/a/229606/3306354

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...