我是shell脚本的新手。我需要逐行读取文件并匹配特定的字符串。如果匹配,则打印x,如果不匹配,则打印y。
这是我正在尝试的。但是,我得到了意想不到的结果。我得到了700行结果,我的/tmp/l1.txt
只有10行。在某个地方,我正在经历循环。感谢您的帮助。
for line in `cat /tmp/l3.txt`
do
if echo $line | grep "abc.log" ; then
echo "X" >>/tmp/l4.txt
else
echo "Y" >>/tmp/l4.txt
fi
done
答案 0 :(得分:1)
我不理解做循环的冲动......
awk '{if($0 ~ /abc\.log/){print "x"}else{print "y"}}' /tmp/13.txt > /tmp/14.txt
询问后编辑......
当然,您的规范并不过分精确,我会对您的行格式得出结论......我们基本上采用与abc.log匹配的整行,将所有内容替换为目录abc和from / log到没有任何东西的行尾,这给我们留下了clusterX / xyz。
awk '{if($0 ~ /abc\.log/){print gensub(/.+\/abc\/(.+)\/logs/, "\\1", 1)}else{print "y"}}' /tmp/13.txt > /tmp/14.txt
答案 1 :(得分:0)
cat /tmp/l3.txt | while read line # read the entire line into the variable "line"
do
if [ -n `echo "$line" | grep "abc.log"` ] # If there is a value "-n"
then
echo "X" >> /tmp/l4.txt # Echo "X" or the value of the variable "line" into l4.txt
else
echo "Y" >> /tmp/l4.txt # If empty echo "Y" into l4.txt
fi
done
如果只给出一个变量,read语句将读取整行,在这种情况下" line"或者,如果您有固定数量的字段,则可以为每个字段指定变量,I.E。 " |同时读取field1 field2"等等... -n测试它们是否为值。 -z将测试它是否为空。
答案 2 :(得分:0)
为什么要担心cat
以及grep
之前的其余部分,您只需测试grep
的返回值,并将所有匹配的行追加到/tmp/14.txt或附加&#34 ; Y":
[ -f "/tmpfile.tmp" ] && :> /tmpfile.tmp # test for existing tmpfile & truncate
if grep "abc.log" /tmp/13.txt >>tmpfile.tmp ; then # write all matching lines to tmpfile
cat tmpfile.tmp /tmp/14.txt # if grep matched append to /tmp/14.txt
else
echo "Y" >> /tmp/14.txt # write "Y" to /tmp/14.txt
fi
rm tmpfile.tmp # cleanup
注意:如果您不希望将grep
的结果附加到/tmp/14.txt,那么只需将cat tmpfile.tmp /tmp/14.txt
替换为echo "X" >> /tmp/14.txt
即可删除1st
和last
行。
答案 3 :(得分:0)
我认为上面的“awk”答案更好。但是,如果您确实需要使用bash循环进行交互,则可以使用:
PATTERN="abc.log"
OUTPUTFILE=/tmp/14.txt
INPUTFILE=/tmp/13.txt
while read line
do
grep -q "$PATTERN" <<< "$line" > /dev/null 2>&1 && echo X || echo Y
done < $INPUTFILE >> $OUTPUTFILE