shell 查看一个文件text.txt里是否包含多个字符串比如A1和A2,如果是,输出yes,不是输出no

求大神指教,越详细越好,初学者
标注一下,是需要同时包含这两个字符串

一个awk语句解决:
awk 'BEGIN{RS=""}{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的结果对其无影响。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-06-19
#!/bin/bash
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,如果是...
一个awk语句解决:awk 'BEGIN{RS=""}{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清空(默认是换行符)...

注册表那些键值都是什么意思?怎么管理?
Windows注册表是帮助Windows控制硬件、软件、用户环境和Windows界面的一套数据文件,注册表包含在Windows目录下两个文件system.dat和user.dat里,还有它们的备份system.da0和user.da0。通过Windows目录下的regedit.exe程序可以存取注册表数据库。在以前,在windows的更早版本(在win95以前),这些功能是靠win.ini,system.ini...

相似回答