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

时间:2014-04-04 11:28:55

标签: 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"; EXIT=0; fi
done

该文件包含文字和多行。

5 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:6)

轮询文件的修改时间,并在字符串发生变化时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

答案 2 :(得分:4)

尝试:

while : ;do
    [[ -f "$FILE" ]] && grep -q "$STRING" "$FILE" && echo "FOUND" && break
done

这将在没有等待的情况下连续循环,您可能想要添加等待期(例如,在此示例中为5秒):

while : ;do
    [[ -f "$FILE" ]] && grep -q "$STRING" "$FILE" && echo "FOUND" && break
    sleep 5
done

答案 3 :(得分:1)

更严格的检查以测试文件FILE中是否包含给定的 $ STRING

awk '$0 == "'${STRING}'"' $FILE

这特别解决了我对@ fstab答案的关注(这也适用于所有其他先前的答案):它检查整行,而不仅仅是一行中的子串存在(就像使用grep解决方案一样)上文)。

循环可以按照其他答案中的说明完成。

答案 4 :(得分:0)

我必须通过脚本将 ssh 密钥添加到 authorized_keys 文件。我找到了两个选项(坏的和丑的:)):

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

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