Como testar se a string existe no arquivo com o Bash?

Eu tenho um arquivo que contém nomes de diretório:

my_list.txt :

 /tmp /var/tmp 

Gostaria de verificar no Bash antes de adicionar um nome de diretório se esse nome já existir no arquivo.

 grep -Fxq "$FILENAME" my_list.txt 

O status de saída é 0 (verdadeiro) se o nome foi encontrado, 1 (falso) se não, então:

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

Aqui estão as seções relevantes da página man do 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. 

Em relação à seguinte solução:

 grep -Fxq "$FILENAME" my_list.txt 

Caso você esteja se perguntando (como eu fiz) o que -Fxq significa em inglês claro:

  • F : Afeta como PATTERN é interpretado (string fixa em vez de regex)
  • x : coincide com a linha inteira
  • q : Shhhhh … impressão mínima

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

Três methods em minha mente:

1) Teste curto para um nome em um caminho (não sei se esse pode ser o seu caso)

 ls -a "path" | grep "name" 

2) Teste curto para uma string em um arquivo

 grep -R "string" "filepath" 

3) Script mais longo usando 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 

Isso deve ser mais rápido se você tiver que testar várias sequências em um conteúdo de arquivo usando um loop, por exemplo, alterando o regex em qualquer ciclo.

Maneira mais simples:

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

Dica: envie para /dev/null se você quiser o status de saída do comando, mas não as saídas.

Se entendi sua pergunta corretamente, isso deve fazer o que você precisa.

  1. você pode especificar o diretório que você gostaria de adicionar através da variável $ check
  2. se o diretório já estiver na lista, a saída é “dir já listado”
  3. se o diretório ainda não estiver na lista, ele será anexado ao my_list.txt

Em uma linha : check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt

A maneira mais fácil e simples seria:

 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 retornará a contagem de quantas vezes a string ocorre no arquivo.

Se você quiser apenas verificar a existência de uma linha, não será necessário criar um arquivo. Por exemplo,

 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 

Minha versão usando o 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 opção faz grep usar expressões regulares

Uma solução sem grep, funciona para mim:

 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 

com base em: https://stackoverflow.com/a/229606/3306354

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