shell 查看一个文件text.txt里是不是包含多个字符串比如A1和A2,如果是,输出yes,不是输出no
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 查看一个文件text.txt里是不是包含多个字符串比如A1和A2,如果是,输出yes,不是输出no相关的知识,希望对你有一定的参考价值。
求大神指教,越详细越好,初学者
标注一下,是需要同时包含这两个字符串
awk 'BEGINRS=""if($0~"A1" && $0~"A2" && $0~"A3" && $0~"A4" && $0~"A5" && $0~"A6" && $0~"A7")print "yes";else print "no"' text.txt
思路就是:
1)awk是按记录(默认为一行文件内容)处理文本的,现在将awk的记录分隔符RS清空(默认是换行符),这样整个文件就会被认为是一条记录。
2)判断该条记录(即整个文件内容)是否匹配A1~A7,都匹配,则打印yes,否则打印no。
不过不知道awk的buffer里能放多少内容,如果文件较大会不会有问题,这种情况有待验证。
————————————————————————————
还有一种跟楼上类似的方式,更容易看懂。
#!/bin/bash
flag=0
for i in 1..7
do
cat text.txt|grep -q "A$i"
[ $? -ne 0 ] && flag=1
done
if [ $flag -eq 0 ]; then
echo yes
else
echo no
fi
考虑性能的话,我觉得awk的方式会更快,因为只需要读一次文件,读入awk的buffer中,然后再分别匹配A1~A7。而第二种方式需要循环读文件。文件操作是最慢的了。追问
我说A1~A7是指随意的7个字符串,用第二种方式就不行了吧
追答第二种方式还是可以的,变通一下即可。
for i in "A1" "A2" "A3" "A4" "A5" "A6" "A7"
do
cat text.txt|grep -q "$i"
if [ $? -ne 0 ]; then
flag=1
break #只要有一个没包含就立即退出for循环,省得做许多无用功
fi
done
多谢大神,还有点迷糊,两个问题:第一,如果用awk,只能和print使用,我怎么把yes或者no这些log输出到某个文件呢,我试了下直接>不行。第二,上面的程序还有点不懂[ $? -ne 0 ] && flag=1, 如果上一句grep有一次没有出来东西,flag被置成1,这里就可以跳出循环了吧;我感觉现在这样写的只取决于最后一个str7是否能grep出来?望赐教! 刷新一下第二个问题有了答案,嘿嘿。
追答第一,> 要在整个awk语句后面用,这种形式: awk '....' text.txt >result.txt
第二,是的,我上面补充回答的已经加了break跳出for循环。但不加也没错,只是效率低点。刷新一下,发现你已经看到了。
“只取决于最后一个str7是否能grep出来”,这个说法不对。因为只有grep不出来,才会改变flag的值(置1),如果flag在grep前面几个字符串的时候就已经被置1了,那么str7的结果对其无影响。
cat text.txt|grep A1 >/dev/null
if [ $? -eq 0 ]
then
cat text.txt|grep A2 >/dev/null
if [ $? -eq 0 ]
then
echo yes
else
echo no
fi
fi追问
谢谢大神,读了一下这个确实OK,不过我后面还要用到去这个txt里查找A1—A7七个字符串,这样写就有点麻烦了,请问还有其他的解法没?多谢啦
以上是关于shell 查看一个文件text.txt里是不是包含多个字符串比如A1和A2,如果是,输出yes,不是输出no的主要内容,如果未能解决你的问题,请参考以下文章