如何测试字符串是否存在文件与Bash?

我有一个包含目录名的文件:

my_list.txt:

/tmp
/var/tmp

如果目录名已经存在于文件中,我想在添加目录名之前检入Bash。

781047 次浏览
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

只选择与整行完全匹配的匹配项。

__abc0, __abc1, __abc2

安静的;不要向标准输出写入任何内容。如果发现任何匹配,即使检测到错误,也立即以零状态退出。也可以查看-s--no-messages选项。

错误处理

正如评论中正确指出的那样,上述方法将错误情况默默地处理,就像找到字符串一样。如果你想以不同的方式处理错误,你必须忽略-q选项,并根据退出状态检测错误:

正常情况下,如果找到选定的行,退出状态为0,否则为1。但如果发生错误,则退出状态为2,除非使用-q--quiet--silent选项并找到所选的行。但是请注意,POSIX只要求,对于grepcmpdiff这样的程序,在出现错误时退出状态大于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

如果我没有理解错你的问题,这个应该可以满足你的需要。

  1. 您可以通过$check变量指定要添加的目录
  2. 如果目录已经在列表中,则输出"dir already listed"
  3. 如果目录还不在列表中,它会被追加到my_list.txt

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

我想到了三个方法:

1)路径中名称的简短测试(我不确定这可能是你的情况)

ls -a "path" | grep "name"
< p > < br > 2)对文件中

的字符串进行简短测试
grep -R "string" "filepath"
< p > < br > 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

如果你使用循环(例如在任何循环中更改正则表达式)拥有测试文件上的多个字符串内容,则该值应该为

关于以下解决方案:

grep -Fxq "$FILENAME" my_list.txt

如果你想知道(像我一样)-Fxq在通俗英语中是什么意思:

  • F:影响PATTERN的解释方式(固定字符串而不是正则表达式)
  • 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.)

更简单的方法:

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

提示:如果你想要命令的退出状态,而不是输出,则发送到/dev/null

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

如果您只是想检查一行是否存在,则不需要创建文件。例如,

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
< p >基于: https://stackoverflow.com/a/229606/3306354 < / p >

最简单的方法是:

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将返回该字符串在文件中出现的次数。

grep -Fxq "String to be found" | ls -a
  • Grep将帮助您检查内容
  • ls将列出所有的文件

由于某种原因,@Thomas的解决方案对我不起作用,但我有更长的字符串和特殊字符和空格,所以我只是像这样更改参数:

if grep -Fxq 'string you want to find' "/path/to/file"; then
echo "Found"
else
echo "Not found"
fi

希望它能帮助到别人

我正在寻找一种方法来做到这一点在终端和过滤线在正常的“grep行为”。将你的字符串放在文件strings.txt中:

string1
string2
...

然后你可以构建一个像(string1|string2|...)这样的正则表达式,并使用它进行过滤:

cmd1 | grep -P "($(cat strings.txt | tr '\n' '|' | head -c -1))" | cmd2

编辑:以上仅适用于你不使用任何正则表达式字符的情况,如果需要转义,可以这样做:

cat strings.txt | python3 -c "import re, sys; [sys.stdout.write(re.escape(line[:-1]) + '\n') for line in sys.stdin]" | ...

与其他答案略有相似,但没有派生cat,条目可以包含空格

contains() {
[[ " ${list[@]} " =~ " ${1} " ]] && echo 'contains' || echo 'does not contain'
}


IFS=$'\r\n' list=($(<my_list.txt))

因此,对于my_list.txt这样的

/tmp
/var/tmp
/Users/usr/dir with spaces

这些测试

contains '/tmp'
contains '/bin'
contains '/var/tmp'
contains '/Users/usr/dir with spaces'
contains 'dir with spaces'

返回

exists
does not exist
exists
exists
does not exist

下面是一个快速搜索和计算字符串或部分字符串的方法:

if grep -R "my-search-string" /my/file.ext
then
# string exists
else
# string not found
fi

你也可以先测试,如果该命令只通过运行返回任何结果:

grep -R "my-search-string" /my/file.ext