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.
- puede especificar el directorio que desea agregar a través de la variable $ check
- si el directorio ya está en la lista, la salida es "dir ya enumerada"
- 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