记一个更新文件的脚本

任务是这样的,从一个文件里面读出来一堆IP,然后对其中以xxx.yyy.zzz开头的IP进行修改,把IP的最后一位改掉之后输出的新的文件中去。

首先有2种遍历文件的方式

先写一种没有用到的方式

filecontent=`cat myfile`

for fileline in $filecontent
do
  ......
done

但用这种方式读出来的fileline,使用空格分开的,就是比如这样一个字串111 222会被读出2个fileline。因为要保持文件格式所以这种方法肯定不行。

#!/bin/bash

CHANGED_IP="xxx.yyy.zzz.qqq"
CHANGED_IPHEAD="xxx.yyy.zzz."
COUNT=1
newfileline=""

rm newfile

while read LINE
do
  if [ "${LINE:(-13)}" == "$CHANGED_IP" ]
  then
     ((COUNT+=1))
     #if [ $COUNT -eq 10 ]
     #then
       #break
       # exit
     #fi

     newIP="xxx.yyy.zzz."$COUNT
     newline="${LINE/%$CHANGED_IP/$newIP}"
     echo "$newline" >> newfile
  else
     echo "$LINE" >> newfile
  fi
done < myfile

最后用diff指令比较两个文件,检查执行的效果。也可用ls -l查看文件大小进行粗略比较。

这里面比较有意思的有下面几处

1如果想要得到一个bool值,则需要在外面加上[  ],注意中括号要和内部的语句有空格间隔。

2自加1 ((Count+=1)),有很多前面有$的写法都是错误的,sh脚本中变量可以不用声明随时使用,且在赋值的时候直接用名称,而在取值的时候加上$符号。

3字符串连接只要把两个字串“贴”在一起就好了

4字符串的判断等于用==而不是用-eq -gt等,而且在变量前后要加上双引号

5最开始除了if语句的判断部分,字符串变量都没有加双引号导致输出的结果中空格都被合并,多个空格变为1个。加了双引号以后内部的空格可以保持,但是头部的缩进仍然消失了。目前解决方法不明。

6“${LINE/%$CHANGED_IP/$newIP}"从尾部匹配字串,"${LINE:(-13)}" 取最后13个字符,相关资料可以看这里

http://hi.baidu.com/pdaliu/blog/item/8cf8af6e058521de81cb4a17.html

7重定向输出的时候用>>表示追加到文件,用>表示覆盖输出

8直接输入shell命令即可执行

9shell脚本和F#有些相似,所有语句块都有输入输出,这里用 < myfile把文件输入定向到while语句,还有一个符号是 | , 据说可以这么用 cat file | while ....。但是还没有研究

10可以用 sh -x xxx.sh跟踪脚本执行

11比较文件用 diff 看help可以看到 -y ...  --suppress-common-lines ,貌似在sh命令里,一个-表示一层参数, --表示满足第一层参数下的第二层参数,比如这里直接用--suppress-common-lines,就同时有-y的效果了。

posted on 2012-02-23 19:02  袁璞  阅读(335)  评论(0)    收藏  举报

导航