最近在寫一些腳本增長工做效率,固然少不了則awk和sed則兩大法寶。在引用腳本中變量上遇到問題,上網上找到一些說明,方法不少。例如awk:mysql
awk中使用shell的環境變量
一:"'$var'"
這種寫法你們無需改變用'括起awk程序的習慣,是老外經常使用的寫法.如:
var="test"
awk 'BEGIN{print "'$var'"}'
這種寫法其實際是雙括號變爲單括號的常量,傳遞給了awk.
若是var中含空格,爲了shell不把空格做爲分格符,便應該以下使用:
var="this is a test"
awk 'BEGIN{print "'"$var"'"}'
二:'"$var"'
這種寫法與上一種相似.若是變量含空格,則變爲'""$var""'較爲可靠.
三.把括起awk程序的''變爲"",使用"$var"
如:
$var="this is a test"
awk 'BEGIN{print "$var"}"
這是由於在""裏$是特殊字符,而在''裏$是普通字符.
四:export 變量,使用ENVIRON["var"]形式,
如:
$var="this is a test";export $var
awk 'BEGIN{print ENVIRON["var"]}'
五:固然也可使用-v選項
如:
$var="this is a test"
awk -v nvar="$var" '{print nvar}'
這樣便把系統變量定義成了awk變量.sql
多了感受記不住。剛剛得出一個很好記的方法。均實驗成功。shell
1.awk '{command}' 中引用變量用單引號。ide
king@king-desktop:~/Accaculation/script$ GW=gateway
king@king-desktop:~/Accaculation/script$ awk '/'$GW'/{print $2}' /etc/network/interfaces
192.168.0.11
king@king-desktop:~/Accaculation/script$ awk ''/$GW/'{print $2}' /etc/network/interfaces
192.168.0.11
this
king@king-desktop:~/Accaculation/script$ awk ''/$GW/','/$ADD/'{print $2}' /etc/network/interfaces
192.168.0.11spa
一樣sed同樣能夠ip
king@king-desktop:~/Accaculation/script$ UN=192.168.0.2字符串
king@king-desktop:~/Accaculation/script$ sed -n 's/192.168.0.11'/"$UN"/'p' /etc/network/interfaces
gateway 192.168.0.2
king@king-desktop:~/Accaculation/script$ sed -n "/"$GW"/p" /etc/network/interfaces
gateway 192.168.0.11it
2.awk "{command}" 中引用變量用雙引號:io
king@king-desktop:~/Accaculation/script$ awk ""/$ADD/","/$GW/"{print $2}" /etc/network/interfaces
address 192.168.0.71
netmask 255.255.255.0
gateway 192.168.0.11
這樣就不行了:
king@king-desktop:~/Accaculation/script$ awk "'/$ADD/','/$GW/'{print $2}" /etc/network/interfaces
awk: '/address/','/gateway/'{print }
awk: ^ 表達式中的無效字符「'」
-------------------------------------------------------------------
3.含有空格的字符串的變量的引用:
不適用的例子就不舉了,免的越看越迷糊,好奇心重的能夠去試試。
ADD="address 192"
king@king-desktop:~/Accaculation/script$ awk ''/"$ADD"/'{print $2}' /etc/network/interfaces
192.168.0.71
king@king-desktop:~/Accaculation/script$ sed -n ''/"$ADD"/'p' /etc/network/interfaces
address 192.168.0.71
均可以用。至於" " 在所引發的sed和awk命令格式的我就不舉了。
1.確實很差用,對應上面的粗體看看有什麼區別。
king@king-desktop:~/Accaculation/script$ awk ""/"$ADD"/"{print $2}" /etc/network/interfaces
address 192.168.0.71
2.不符合總結得出的簡單規律--單引號引用的命令用單引號引用變量,含有空格的變量多加先用雙引號引用。 一樣的mysql -uroot -e " select * from table where pid="$PID" " 一樣生效 。單引號的有興趣的去試試。