Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Bash脚本-检查文件是否包含特定行_String_Bash_If Statement_Conditional Statements - Fatal编程技术网

String Bash脚本-检查文件是否包含特定行

String Bash脚本-检查文件是否包含特定行,string,bash,if-statement,conditional-statements,String,Bash,If Statement,Conditional Statements,我需要检查文件是否包含特定行。这个文件是有人连续写的,所以我把检查放在一个while循环中 FILE="/Users/test/my.out" STRING="MYNAME" EXIT=1 while [ $EXIT -ne 0 ]; do if [ -f $FILE ] ; then CHECK IF THE "STRING" IS IN THE FILE - IF YES echo "FOUND"; E

我需要检查文件是否包含特定行。这个文件是有人连续写的,所以我把检查放在一个while循环中

FILE="/Users/test/my.out"
STRING="MYNAME"
EXIT=1
while [ $EXIT -ne 0 ]; do 
    if [ -f $FILE ] ; then CHECK IF THE "STRING" IS IN THE FILE - IF YES echo "FOUND"; EXIT=0; fi
done
该文件包含文本和多行。

请尝试:

while : ;do
    [[ -f "$FILE" ]] && grep -q "$STRING" "$FILE" && echo "FOUND" && break
done
这将在不等待的情况下连续循环,您可能需要添加等待时间(例如本例中的5秒):


如果
$FILE
包含文件名,
$STRING
包含要搜索的字符串, 然后,您可以使用以下命令显示文件是否匹配:

if [ ! -z $(grep "$STRING" "$FILE") ]; then echo "FOUND"; fi

当字符串更改时,轮询文件的修改时间和grep:

while :; do
    a=$(stat -c%Y "$FILE") # GNU stat
    [ "$b" != "$a" ] && b="$a" && \
        grep -q "$STRING" "$FILE" && echo FOUND
    sleep 1
done

注意:BSD用户应使用
stat-f%m

更严格的检查来测试文件中是否包含给定的$字符串

awk '$0 == "'${STRING}'"' $FILE
这特别解决了我对@fstab答案的担忧(这也适用于之前的所有其他答案):它检查完整的行,而不仅仅是检查行中是否存在子字符串(正如上面的grep解决方案所做的那样)


循环可以如其他答案所示完成

我必须从脚本中将ssh密钥添加到
authorized_keys
文件中。我找到了两种选择(坏的和丑陋的:):


我原以为使用uniq会更简洁,但事实证明并非如此。需要调整权限。。。行的顺序改变了。。。看起来不太好。

你不使用
grep(1)
有什么原因吗?
grep-q
应该是首选:如果它找到字符串,它就不必读取整个文件:
[-f“$f”]&&grep-q“$str”“$f”&&break
你应该引用你的变量:真正的数据可能不仅仅是一个单词,文件名可以包含空格。cat:grep无用地使用文件名参数。imho这并不能真正回答问题,因为如果$STRING是行的一部分,它也会报告“find”。问题是关于是否存在特定的线路<我想到了code>grep“^$STRING”'$',但在这里不够通用,因为字符串可能包含一些可能被误认为regex的元素。这也适用于所提供的解决方案。在我自己的bash脚本中使用该解决方案时,我一直得到一个“[:Status:binary operator expected”。我将其更改为双方括号,并且它工作了。我想知道为什么没有人使用
fgrep
grep-F
)在这里…然后,此检查将成功,特别是当搜索的字符串是文件行的子字符串时。请在mtime上进行筛选。
awk '$0 == "'${STRING}'"' $FILE
for f in "$tmp/keys/"*; do
    line=`cat "$f"`
    dst_line=`fgrep "$line" "$home/.ssh/authorized_keys" || true`
    if [ "$line" != "$dst_line" ]; then
        echo "$line" >> "$home/.ssh/authorized_keys"
    fi
done
for f in "$tmp/keys/"*; do
    cat "$f" >> "$home/.ssh/authorized_keys"
done
cat "$home/.ssh/authorized_keys" | sort | uniq > "$home/.ssh/authorized_keys.new"
chmod 0600 "$home/.ssh/authorized_keys.new"
chown "$user:" "$home/.ssh/authorized_keys.new"
mv "$home"/.ssh/authorized_keys.new \
    "$home"/.ssh/authorized_keys