1. 程式人生 > >awk使用shell變數及shell使用awk中的變數

awk使用shell變數及shell使用awk中的變數

在寫shell指令碼時,經常會使用到awk程式。但是有些複雜的邏輯,可能需要在awk中使用在shell中定義的變數,而且awk程式處理之後,產生的中間變數,還需要在shell中繼續處理。

一、那如何在awk中使用在shell中定義的變數呢?

方法一:使用"'把shell變數包起來,即"'$var'";注意是“雙引號+單引號+shell變數+單引號+雙引號”的格式。

這種寫法大家無需改變用'括起awk程式的習慣,是老外常用的寫法;這種寫法其實際是雙括號變為單括號的常量,傳遞給了awk.

例如:

var="abc"

awk 'BEGIN{print "'$var'"}'

方法二:和方法一類似,但使用"'"把shell變數包起來,即"'"$var"'";注意是“雙引號+單引號+雙引號

+shell變數+雙引號+單引號+雙引號”的格式。

如果變數的值中包含空格,為了shell不把空格作為分隔符,則應使用方法二。

例如:

var="this a test"

awk 'BEGIN{print "'"$var"'"}'

方法三:export變數,然後在awk中使用ENVIRON["var"]形式獲取環境變數的值

例如:

var="this a test"; export var;

awk 'BEGIN{print ENVIRON["var"]}'  

方法四:使用awk -v選項;

當變數不是很多時,建議使用這種方式。

例如:

var="this a test"

awk -v awkVar="$var" 'BEGIN
{print awkVar}'

二、那shell中如何使用awk程式中定義的變數呢?

“由awk向shell傳遞變數”,其思想無非是用awk(sed/perl等也是一樣)輸出若干條shell命令,然後再用shell去執行這些命令。

例如:

eval $(awk 'BEGIN{print "var1='str1';var2='str2'"}')
或者eval $(awk '{printf("var1=%s; var2=%s; var3=%s;",$1,$2,$3)}' abc.txt)


之後可以在當前shell中使用var1,var2等變量了。
echo "var1=$var1 ----- var2=$var2"

三、一個檢測磁碟空間使用情況的指令碼的例子

#!/bin/sh
#檔案系統名字
FILE_SYSTEM_NAME="rootfs"

#檔案系統掛在的目錄
MOUNTED_ON="/"

# shell命令使用awk中定義的變數spaceSize
eval $(df -P | awk '$1=="'"$FILE_SYSTEM_NAME"'" && $6=="'$MOUNTED_ON'" {printf("spaceSize=%s;",$5)}')
echo "主磁碟的使用空間為$spaceSize"

spaceSize=`echo $spaceSize | cut -d% -f1`
if [ aa$spaceSize = "aa" ]; then
    spaceSize=-1
fi

if [ $spaceSize -le 85 ]; then
    echo '主磁碟的使用空間充足'
elif [ $spaceSize -eq -1 ]; then
    echo '沒有找到主磁碟使用空間,請檢查指令碼'
else
    echo '主磁碟的使用空間超過閾值'
fi