一、rev(將文本橫向倒置)html
取出下面11文檔中等號後面的內容,而且去掉每行內容最後3個字符,這個經過一個簡單的rev命令即可以很容易實現shell
二、tac(將文本縱向倒置)數組
一般能夠合sed結合,將多個文本的最後一行或者多行替換掉ide
總結:shell許多命令都是順序處理文本,針對逆序處理的狀況彷佛很差定位,可是有了上面兩個命令,不少狀況就明朗啦,所謂「負負得正」的原理,嘿嘿函數
三、awk中讓數組下標有序輸出和數組value有序輸出spa
通常作法:awk '{b[$1]=$2}END{for(i in b)print i,b}' 此時輸出的數組下標不是文件裏原有的順序,也就是亂序了。
解決辦法:awk '{a[$1]=$2;c[j++]=$1}END{for(m=0;m<j;m++)print c[m],a[c[m]]}'
固然c了上面的方法外,還有一個更簡便的方法用asorti()函數來實現,原理是同樣的.net
awk '{a[$1]=$2}END{slen=asorti(a,b);for(i=1;i<=slen;i++) print i"\t"b[i]"\t"a[b[i]]}' test
命令行
假如要作數組value排序呢?asorti相似的一個方法asort能夠實現,例子以下
unix
我的認爲此函數用處很少,由於將原來的數組下標給丟掉了,若是想對value排序,又不丟掉數組下標,將awk的結果用shell下的sort命令實現更加人性化,可能多了一層管道,效率會相對低一些。cdn
總結下awk的兩排序函數區別:
4:shell下的數組:注:BASH只支持一維數組,但參數個數沒有限制。
聲明一個數組:
declare -a array
(其實不用聲明,按數組方式直接賦值給變量便可,BASH就知道那是數組)
數組賦值:
(1) array=(var1 var2 var3 ... varN)
(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
(3) array[0]=var1
arrya[1]=var2
...
array[n]=varN
計算數組元素個數:${#array[@]} 或者 ${#array[*]}
BASH的特殊參數 @ 和 * 都表示「擴展位置參數,從1開始」,但形式稍有差別,但在數組裏使用好像是能夠通用的。
輸出數組全部元素:echo ${array[@]} 或者 ${array[*]}
引用數組元素:echo ${array[n]}
清除指定的單個數組元素:unset array[n]
清除整個數組:unset array
遍歷數組:
filename=(`ls`)
for var in ${filename[@]};do
echo $var
done
數組實用示例:
一、將字符串裏的字母逐個放入數組,並輸出到「標準輸出」
chars='abcdefghijklmnopqrstuvwxyz'
for (( i=0; i<26; i++ )) ; do
array[$i]=${chars:$i:1}
echo ${array[$i]}
done
${chars:$i:1},表示從chars字符串的 $i 位置開始,獲取 1 個字符相似awk下的substring函數。
二、如何用變量來替換數組名?下面例子爲獲取flag值對應的cdntype(cdn01中的元素,cdntype=1 ...cdn05中的元素 cdntype=5)
cdn01=("koram" "batheo" "batheoeu" "jpas" "asth" )
cdn02=("askr")
cdn03=("zsml")
cdn03=("wiyou")
cdn05=("zspt" "zsru" "zsfr" "zses" "de" "zsit")
for i in {1..5}
do
cdn="cdn0$i"
for num in $(eval echo \${$cdn[@]}) //實現用變量來替換數組名,而且獲取數組的全部元素
do
if [ $num == "$flag" ];then
cdntype=$i
break
fi
done
done
5:eval的做用是再次執行命令行處理,也就是說,對一個命令行,執行兩次命令行處理。
一個極其簡單的例子能夠說明
(詳情可參照該連接http://www.cnblogs.com/huzhiwei/archive/2012/03/14/2395956.html)
6:grep 比較2個文件差別
grep -vwf file1 file2 (file2中存在file1中不存在的)
grep -wf file1 file2(提取公共部分)
grep -vwf file1 file2 && -vwf file2 file1(提取文件不一樣部分)