我正在尝试对多个文件中的分隔符(逗号、竖线或分号)进行 grep。
如果文件包含这些定界符中的任何一个,则没有问题。我想将不包含任何这些定界符的文件移动到 mvfiles
目录。该脚本当前正在移动所有文件,即使文件中存在分隔符也是如此。
filename=$(find /opt/interfaces/sample_check -type f \( -name "*message.txt*" -or -name "*comma2*" -or -name "*comma3*" \))
pathname=/opt/interfaces/sample_check
echo $filename
echo $pathname
if `head -1 $filename | grep -o [';']`; then
echo "Found"
else
mv $filename /opt/interfaces/sample_check/mvfiles
fi
尝试稍微调整一下您的逻辑。此外,在 grep 模式中包含所有定界符,并调整引号的位置。
pathname=/opt/interfaces/sample_check
find "$pathname" -type f \( -name "*message.txt*" -or -name "*comma[23]*" \) |
while read -r filename
do if sed -n '1d; 2{ /[,;|]/q0 }; q1' "$filename"
then echo "Delimited: $filename"
else echo "Moving ==>> $filename"
mv "$filename" /opt/interfaces/sample_check/mvfiles/
fi
done
因为我们只想根据文件第 2 行中的分隔符来决定,所以让我们改用 sed
。
sed -n '1d; 2{/[,;|]/q0 }; q1'
sed -n
表示除非请求,否则不打印任何内容 - 我们不需要任何输出。
1d
删除第一行(我们没有编辑,只是放弃对该行的任何进一步处理,因此它会跳过程序的其余部分。)
2{...}
表示仅在第 2 行执行这些命令。/[,;|]/q0
表示该行是否有任何逗号、分号、或管道,然后使用 zeo 退出代码退出以指示成功。
q1
表示如果到达此处,退出代码为 1。
这些触发了 if
的分支。 :)
我是一名优秀的程序员,十分优秀!