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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM