una scripts script manejo extraer ejemplos comando caracter cadenas cadena buscar string bash file

string - scripts - manejo de cadenas en shell script



¿Cómo probar si existe cadena en el archivo con Bash? (11)

La forma más fácil y sencilla sería:

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 devolverá el recuento de cuántas veces se produce la cadena en el archivo.

Tengo un archivo que contiene nombres de directorio:

my_list.txt

/tmp /var/tmp

Me gustaría verificar en Bash antes de agregar un nombre de directorio si ese nombre ya existe en el archivo.


Manera más sencilla:

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

Consejo: envíe a /dev/null si desea el estado de salida del comando, pero no las salidas.


Mi versión usando fgrep

FOUND=`fgrep -c "FOUND" $VALIDATION_FILE` if [ $FOUND -eq 0 ]; then echo "Not able to find" else echo "able to find" fi


Respecto a la siguiente solución:

grep -Fxq "$FILENAME" my_list.txt

En caso de que se esté preguntando (como lo hice) qué significa -Fxq en inglés simple:

  • F : afecta a cómo se interpreta PATTERN (cadena fija en lugar de una expresión regular)
  • x : emparejar toda la linea
  • q : Shhhhh ... impresión mínima

Desde el archivo 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.)


Si entendí tu pregunta correctamente, esto debería hacer lo que necesitas.

  1. puede especificar el directorio que desea agregar a través de la variable $ check
  2. si el directorio ya está en la lista, la salida es "dir ya enumerada"
  3. si el directorio aún no está en la lista, se adjunta a my_list.txt

En una línea : 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


Si solo desea verificar la existencia de una línea, no necesita crear un archivo. P.ej,

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


Tres métodos en mi mente:

1) Prueba corta para un nombre en una ruta (no estoy seguro de que este sea tu caso)

ls -a "path" | grep "name"


2) Prueba corta para una cadena en un archivo

grep -R "string" "filepath"


3) Un script bash más largo usando expresiones regulares:

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

Esto debería ser más rápido si tiene que probar varias cadenas en el contenido de un archivo usando un ciclo, por ejemplo, cambiando la expresión regular en cualquier ciclo.


Una solución sin grep, funciona para mí:

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

basado en: https://.com/a/229606/3306354


grep -E "(string)" /path/to/file || echo "no match found"

La opción -E hace que grep use expresiones regulares


grep -Fxq "$FILENAME" my_list.txt

El estado de salida es 0 (verdadero) si se encontró el nombre, 1 (falso) si no, así que:

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

Aquí están las secciones relevantes de la página del manual para 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.


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