我需要检查文件是否包含特定行。这个文件是由某人连续写的,所以我把检查放在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
该文件包含文字和多行。
答案 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
会更简洁,但事实证明并非如此。而且需要调整权限……而且行的顺序变了……不太好看。