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Если вы хотите получить статус выхода команды, но не выходы.
Если я правильно понял ваш вопрос, это должно делать то, что вам нужно.
- вы можете указать каталог, который вы хотели бы добавить через переменную $check
- если каталог уже находится в списке, то выводится "dir already listed"
- если каталог еще не находится в списке, он добавляется в 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 figrep-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
Comments