用于在文件中搜索字符串的Linux脚本

时间:2014-08-12 01:27:04

标签: linux bash

我是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

4 个答案:

答案 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即可删除1stlast行。

答案 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