Bash 如果grep失败,请删除该文件
嘿,伙计们,我有一个小脚本,我需要对所有文件进行grep处理,只留下那些包含关键字的文件,我被困在这一点上,任何帮助指出我愚蠢的错误都是非常感谢的:Bash 如果grep失败,请删除该文件,bash,scripting,shell,grep,Bash,Scripting,Shell,Grep,嘿,伙计们,我有一个小脚本,我需要对所有文件进行grep处理,只留下那些包含关键字的文件,我被困在这一点上,任何帮助指出我愚蠢的错误都是非常感谢的: #!/bin/bash server=(server1...server24) . . . for ((n=0; n <= 24 ; n++)) do if grep -q "KEYWORD" directory/${server[$n]}.html ; then echo Empty
#!/bin/bash
server=(server1...server24)
.
.
.
for ((n=0; n <= 24 ; n++))
do
if grep -q "KEYWORD" directory/${server[$n]}.html ; then
echo Empty
else
rm -f directory/${server[$n]}.html
fi
done
.
.
.
您可以对grep使用-l选项
grep -l "KEYWORD" directory/server*html | while read -r FOUND
do
rm -f .....
do some other processing here.....
done
确保:
在列表中分隔服务器名称
按空格排列为:
服务器=服务器1服务器2服务器3。。。服务器24
有效索引的范围为0到23
比数组的数量少一个
元素。所以你的for循环应该
是:
对于n=0;n我建议您对每个文件执行grep,然后测试退出状态$?-并修复你的支架扩张 所以
for ((n=0; n <= 24 ; n++))
do
grep -q "KEYWORD" directory/server${n}.html
if [ $? -eq 0 ] then
echo "directory/server${n}.html - Has keyword"
else
rm -f directory/server${n}.html
fi
done
如果您让代码通过以下方式之一为您执行操作,则不必确保计数匹配:
servers=(foo bar baz)
for server in ${servers[@]}
do
if ! grep -qs "KEYWORD" directory/$server.html
then
rm ...
或
使用!若要反转条件,使其在文件不包含关键字的情况下生效,请将其删除
使用grep选项-q使输出静音,使用-s抑制错误消息。实际上我需要这行代码,因为我的每台服务器都有不同的主机名,我只是在这里输入server1-24以简化代码。为了清楚起见,我在这里输入server1-24以简化代码,实际上我的24台服务器都有不同的主机名,这就是我需要服务器阵列的原因。你的回音为空有点让人困惑。你知道如果你找到关键字你会得到的,对吗?是的,那只是一个愚蠢而快速的方法来确保if语句工作,如果它找到关键字,它不会对文件做任何事情,因为在这种情况下,我想保留文件,我只想删除那些没有keyword.grep-l keyword directory/*.html | xargs-r rm-f-l not-l的文件(对于没有matchDang的文件):这是最好的答案,只要你合并@pixelbeat的两个注释。并且,根据OP的要求,将directory/server*html更改为$server。当然,可以使用xargs。但我不会改变我的答案。因为我假设还需要做一些其他的处理。这就是为什么它只是一个建议,它有助于可读性。。大括号展开修复了错误。
servers=(foo bar baz)
for server in ${servers[@]}
do
if ! grep -qs "KEYWORD" directory/$server.html
then
rm ...
servers=(foo bar baz)
for ((n = 0; n < ${#servers[@]}; n++))
do
if ! grep -qs "KEYWORD" directory/${servers[$n]}.html
then
rm ...