小花朵朵

导航

sed、awk调用shell变量的方法

 

 这两天小弟用sed查找替换的功能,想查找替换完字符后把源文件覆盖掉,网上查了查资料,也没有现成结果(拿来主义,懒人一族),不得已自己得写了,其实很简单,脚本如下:


 bash-2.05# sed -e 's/windows/linux/g'  free.htm >temp ;      rm free.htm ;   mv temp free.htm

一行写下来,free.htm是源文件,只是用了一个临时文件temp

供大家查考吧,是不是太简单了

以上来自网络,但是实在是没什么用。

1.使用sed命令替换字符串中的指定字符,并显示替换的行:

sed 可以使用shell变量,只需将单引号变为双引号即可。

 76 #Change every script's name
 77 
 78 for i in $list ;do
 79     len=${#i}
 80     realfile=${i:`expr $len - 21`:21}
 81     if [[ $realfile != "upgrade_partitions.sh" ]] ;then
 82         if [[ $flag == "add" ]] ;then
 83             newname=$(echo "$i" | sed -n "s/_${version}.sh/_`expr ${version} + 1`.sh/p")
 84         else
 85             newname=$(echo "$i" | sed -n "s/_${version}.sh/_`expr ${version} - 1`.sh/p")
 86         fi
 87         echo "newname:$newname"
 88         mv $i $newname
 89     fi
 90 done

2.只用 '-i' 选项,sed可以使替换后的文件写回到源文件,实现文件的覆盖。

 57 #Change the content of every script
 58 for i in $list ;do
 59     len=${#i}
 60     realfile=${i:`expr $len - 21`:21}
 61     if [[ $realfile != "upgrade_partitions.sh" ]] ;then
 62         echo "The $i file need change!" 
 63         if [[ $flag == "add" ]];then
 64 #           scr_str=$(printf "%s%s%s" "_" $version ".sh")
 65 #           echo "$i : version:$scr_str"
 66             sed -i  "s/_${version}.sh/_`expr $version + 1`.sh/g" $i
 67         else
 68             sed -i  "s/_${version}.sh/_`expr $version - 1`.sh/g" $i
 69         fi
 70     else
 71         echo "The upgrade_partitions.sh no need change!"    
 72     fi
 73 
 74 done

我们在编写shell脚本的时候,经常会遇到在脚本中使用awk或sed去调用shell环境中的变量的时候,下面我简单的说一下调用的方法。

      sed一般使用单引号,sed引用shell变量时使用双引号即可,因为双引号是弱转义,不会去除$的变量表示功能,而单引号为强转义,会把$作为一般符号表示,所以不会表示为变量。

1 sed  -e "s#user_defined_basedir#$mysql_base_dir#g"  -e "s#user_defined_datadir#$mysql_data_dir#g" mysqld.sh -i

       awk在调用shell变量时,需要使用参数-v,举例说明

1 awk  -v a=$second -v b=$count '$2==a{sum += $1};END {print sum/b}'  filename

 

       其中$second、和$count为shell中变量,可以看出,每调用一次变量都要加一个-v参数,后面使用shell变量的时候,就不用加$了,直接是a和b就好了

------------------------------------------------------------------------------------------------------------------------

来自:http://blog.chinaunix.net/uid-7396950-id-2056484.html

最近做预料处理,使用bash脚本,需要在脚本的sed和awk使用shell变量以控制循环,出现一些问题后找到解决办法如下:
1.sed使用shell变量
 这个比较好办,sed命令中可以用单引号和双引号,一般我们习惯用单引号,如下:

1  sed -i 's/pattern1/pattern2/g' inputfile
2  #如果要使用shell变量,就需要使用双引号
3 pattern1=XXX
4 pattern2=XXX 
5 sed -i "s/$pattern1/$pattern2/g" inputfile


2. awk使用shell变量

 1 有很多种方法,最简单的一种记录如下:
 2 line=XXX
 3 awk '$1== " '$line' " {print $0}' inputfile
 4 注意的是,awk命令本身需要将模式和动作部分用单引号引用,所以里面引用shell变量是双引号+单引号,双引号是保证正确处理变量值的空格,放大一下:
 5 " '$line' "
 6 另外:
 7 awk '$1="win"{$"'$curcls'"=$"'$curcls'"+1;print $0}' nwf
 8 则是另一种间接引用模式,因为通常shell的间接引用是使用
 9 eval echo \$$var
10 更高级的
11 a=10
12 b=a
13 c=${!b}
14 则c=10

 

 

 

posted on 2012-10-25 00:35  小花朵朵  阅读(40347)  评论(0编辑  收藏  举报