sed、awk调用shell变量的方法

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
复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值