[sh]awk用法
阿新 • • 發佈:2020-09-14
grep匹配第一個則停止
grep -m
-m num, --max-count=num
Stop reading the file after num matches.
shell中的陣列
- 定義
nums=(29 100 13 8 91 44)
# 弱型別的
arr=(20 56 "http://c.biancheng.net/shell/")
- 新增元素
awk將二維錶轉換為kv格式
awk ' { if(NR == 1) { for (i=2; i <= NF;i++) type[i]=$i }else { for (j=2;j <= NF; j++) arr[$1,type[j]]=$j } } END { for (k in arr) { split(k, idx, SUBSEP); gsub(/\.|-/,"_",idx[1]) gsub(/\/|\(|\)/,"_",idx[2]) gsub(/False/,"0",arr[k]) gsub(/True/,"1",arr[k]) print "GamesvrOnline""{usage=\""idx[2]"\",GameSvr=\""idx[1]"\"} "arr[k] } }'
nums[6]=88
ages=([3]=24 [5]=19 [10]=12) # 只支援整型下標
- 獲取元素
n=${nums[2]}
# 獲取所有元素
${nums[*]}
${nums[@]}
- 例項
nums=(29 100 13 8 91 44)
echo ${nums[@]} #輸出所有陣列元素
nums[10]=66 #給第10個元素賦值(此時會增加陣列長度)
echo ${nums[*]} #輸出所有陣列元素
echo ${nums[4]} #輸出第4個元素
29 100 13 8 91 44
29 100 13 8 91 44 66
91
awk的for迴圈
學習awk的內建變數,及預設值
學習awk的內建函式
awk中陣列和shell中陣列用法不一樣. 它支援字串下標
awk一維陣列
a) 數字下標
array[1]="it"
array[2]="homer"
array[3]="sunboy"
array[4]=2050
b) 字元下標
array["first"]="yang"
array["second"]="gang"
array["third"]="sunboy"
- 獲取
#!/bin/bash awk 'BEGIN{ array[1]="it" array[2]="homer" array[3]="sunboy" array[4]=2050 array["first"]="yang" array["second"]="gang" array["third"]="sunboy" print array[1], array[4] print array[3], array["third"]}'
- 遍歷
#!/bin/bash
awk 'BEGIN{
for(i=1; i<=5; i++){
array[i] = i*2 - 1;
}
for(i in array){
print i" = " array[i];#i是下標, array[i]是對應的值
}
}'
awk二維陣列
awk 多維陣列在本質上是一維陣列,因awk在儲存上並不支援多維陣列,
awk提供了邏輯上模擬二維陣列的訪問方式。例如,array[2,3] = 1這樣的訪問是允許的。
awk使用一個特殊的字串SUBSEP (\034)作為分割欄位,
在上面的例子 array[2,3] = 1 中,關聯陣列array儲存的鍵值實際上是2\0343,
2和3分別為下標(2,3),\034為SUBSEP分隔符
類似一維陣列的成員測試,多維陣列可以使用 if ( (i,j) in array) 語法,但是下標必須放置在圓括號中。
類似一維陣列的迴圈訪問,多維陣列使用 for ( item in array ) 語法遍歷陣列。與一維陣列不同的是,多維陣列必須使用split()函式來訪問單獨的下標分量,格式: split ( item, subscr, SUBSEP), 例如: split (item, array2, SUBSEP); 後,array2[1]為下標“2”, array2[2]為下標“3”
示例:
#!/bin/bash
awk 'BEGIN{
for(i=1; i<=3; i++){
for(j=1; j<=3; j++){
array[i, j] = i * j;
print i" * "j" = "array[i,j];
}
}
print
for(i in array){
split(i, array2, SUBSEP);
print array2[1]" * "array2[2]" = " array[i]; # array2[1]為下標第一項, array2[1]為下標第二項,
}
}'
- 內建函式
[gsub(//|(|)/,"_",idx[2]) # 返回替換的次數.(https://blog.csdn.net/zhuying_linux/article/details/7104938)
length