У меня есть файл, содержащий имена каталогов:
my_list.txt:
/tmp
/var/tmp
Я хочу проверить Bash, прежде чем добавить имя каталога, если это имя уже существует в файле.
У меня есть файл, содержащий имена каталогов:
my_list.txt:
/tmp
/var/tmp
Я хочу проверить Bash, прежде чем добавить имя каталога, если это имя уже существует в файле.
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Интерпретировать PATTERN как список фиксированных строк, разделенных символами новой строки, любой из которых должен соответствовать.
-x,--line-regexpВыберите только те совпадения, которые точно соответствуют всей строке.
-q,--quiet,--silentТихо; не пишите ничего в стандартный вывод. Выйдите немедленно с нулевым статусом, если найдено какое-либо совпадение, даже если обнаружена ошибка. Также см. параметр
-sили--no-messages.
Как справедливо указано в комментариях, вышеупомянутый подход молча обрабатывает случаи ошибок, как если бы строка была найдена. Если вы хотите обрабатывать ошибки другим способом, вам придется пропустить опцию -q и обнаруживать ошибки в зависимости от состояния выхода:
Обычно статус выхода равен 0, если найдены выбранные строки, и 1 в противном случае. Но состояние выхода равно 2, если произошла ошибка, если только не используется опция
-qили--quietили--silentи не найдена выбранная строка. Однако обратите внимание, что POSIX только для программ, таких какgrep,cmpиdiff, обязывает, чтобы состояние выхода в случае ошибки было больше 1; поэтому для переносимости целесообразно использовать логику, которая проверяет это общее условие, вместо строгого равенства с 2.
Чтобы подавить нормальный выходной сигнал из grep, вы можете перенаправить его на /dev/null. Обратите внимание, что стандартная ошибка остается ненаправленной, поэтому любые сообщения об ошибках, которые может напечатать grep, будут появляться на консоли, как вы, вероятно, захотите.
Для обработки трех случаев мы можем использовать оператор case:
case 'grep -Fx "$FILENAME" "$LIST" >/dev/null; echo $?' in
0)
# code if found
;;
1)
# code if not found
;;
*)
# code if an error occurred
;;
esac
Что касается следующего решения:
grep -Fxq "$FILENAME" my_list.txt
Если вам интересно (как и я), что означает -Fxq на простом английском языке:
F: влияет на интерпретацию PATTERN (фиксированная строка вместо регулярного выражения)x: совпадение всей строкиq: Shhhhh... минимальная печатьИз файла 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.)
Три метода в моем сознании:
1) Короткий тест для имени в пути (я не уверен, что это может быть ваш случай)
ls -a "path" | grep "name"
2) Короткий тест для строки в файле
grep -R "string" "filepath"
3) Дольше bash script с использованием регулярного выражения:
#!/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, если вы хотите получить статус выхода, но не выходы.
Самый простой и простой способ:
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 вернет счет того, сколько раз строка в файле появляется.
Если я правильно понял ваш вопрос, это должно сделать то, что вам нужно.
В одной строке: check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt
Если вы просто хотите проверить существование одной строки, вам не нужно создавать файл. Например,
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-less работает для меня:
MY_LIST=$( cat /path/to/my_list.txt )
if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
echo "It there!"
else
echo "its not there"
fi
на основе: fooobar.com/questions/833/...
grep -Fxq "String to be found" | ls -a
if grep -q "$Filename$" my_list.txt
then
echo "exist"
else
echo "not exist"
fi