Как проверить, существует ли строка в файле с Bash?



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



my_list.txt:



/tmp
/var/tmp


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

1018   11  

11 ответов:

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.

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

grep -Fxq "$FILENAME" my_list.txt

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

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

из файла человек:

-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.)

три метода в моем уме:

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

ls -a "path" | grep "name"


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

grep -R "string" "filepath"


3) Более длинный скрипт bash с использованием regex:

#!/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

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

проще так:

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

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

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

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

в одну строку:check="/tmp/newdirectory"; [[ -n $(grep "^$check$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt

легкий и простой способ будет такой:

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 возвращает количество раз, когда строка встречается в файле.

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

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  

моя версия с помощью fgrep

  FOUND=`fgrep -c "FOUND" $VALIDATION_FILE`
  if [ $FOUND -eq 0 ]; then
    echo "Not able to find"
  else
    echo "able to find"     
  fi  
grep -E "(string)" /path/to/file || echo "no match found"

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

решение без grep, работает для меня:

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

if grep -q "$Filename$" my_list.txt
   then
     echo "exist"
else 
     echo "not exist"
fi

Comments

    Ничего не найдено.