Shell高階語法 awk配合eval實現快速變數

2021-10-10 19:28:49 字數 2322 閱讀 7067

朋友們好,很高興再次見面,今天我們來了解一下shell程式設計的乙個高階語法:如何快速的設定變數

首先我們回顧一下變數,在變數中,只有變數值是可變的(複雜變數能實現變數名與變數值都是可變的),例如下面這個:

下面先帶來乙個普通場景下的指令碼優化,需求如下:

使用shell指令碼檢測當前系統共有多少記憶體,已使用記憶體和剩餘記憶體分別是多少

首先我們先執行記憶體資訊檢視的命令:

echo -e "本機總記憶體: [ $total ]

當前已使用: [ $used ]

當前還剩餘: [ $free ]"

執行結果:

可以看出來,當前的指令碼是沒有任何問題的,但是這樣的寫法顯得太低階了(每個變數都要另起一行),那麼高階一點的語法應該怎樣來呢?這時候用上awk的printf功能就行了

我們首先執行下面這條命令看看:

free  -h |

awk'nr==2'

|awk

''

然後得出的結果是這樣的:

[root@localhost ~]

# free -h | awk 'nr==2' |awk ''

t=3.7g

u=603m

f=693m

[root@localhost ~]

#

從結果可以看到,此時的輸出結果就是一條條的賦值語句,然後我們直接列印變數名看看:

這時候我們可以發現,雖然在上一條命令的輸出結果中全部都是賦值語句,但是直接列印變數名卻沒有任何反應,那這時候我希望輸出的結果直接進行賦值應該怎麼做呢?

free  -h |

awk'nr==2'

|awk

''> var.sh

source var.sh

執行結果:

這種方式雖然能夠實現需求,但是還是太麻煩了,那麼最簡單的方式就是第二種啦!

eval二次檢測時啥意思呢?也就是說當我們執行了下面這條命令的時候:

free  -h |

awk'nr==2'

|awk

''

這條命令就相當於乙個變數名,而輸出的值則是乙個變數值,而二次檢測就是對第一次的變數值進行二次運算,也就是把下面這段內容當作命令再執行一次:

t=3.7g

u=604m

f=692m

那麼怎麼用呢?其實很簡單,只需要在前面加個eval,然後之前的命令使用反引號包含即可,命令如下:

eval

`free -h |

awk'nr==2'

|awk''`

執行結果如下:

所以最終的優化指令碼就是:

eval

`free -h |

awk'nr==2'

|awk''`

echo -e "本機總記憶體: [ $t ]

當前已使用: [ $u ]

當前還剩餘: [ $f ]"

執行結果:

shell 之awk 關聯陣列高階應用

最近由於資料遷移過,有些使用者資訊需要再次確認下,也許資料量比較大,但是需要最終確認的比如說是使用者id和其對應的使用者積分數,這樣就會導致出現文字a 老的資料 文字b 新的資料 比如 1101 1231102 1111103 1451104 152 這是文字a.txt 文字b.txt如下 1101...

awk 高階技巧

netstat nat awk sort uniq c sort rn netstat n awk tcp end 或 netstat n awk tcp end netstat n awk tcp end netstat n awk tcp sort uniq c sort rn netstat ...

awk 基礎語法 2 awk變數

0當前處理行的所有記錄 1,2,3.n檔案中每行以間隔符號分割的不同字段 nf當前記錄的字段數 列數 nf最後一列 fnr nr行號 fs定義間隔符 ofs定義輸出字元分隔符,預設空格 rs輸入記錄分隔符,預設換行 ors輸出記錄分隔符,預設換行 1.2.1.案例資料 chen localhost ...