朋友們好,很高興再次見面,今天我們來了解一下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 ...