shell下幾個簡單有效的命令和方法

一、rev(將文本橫向倒置)html

取出下面11文檔中等號後面的內容,而且去掉每行內容最後3個字符,這個經過一個簡單的rev命令即可以很容易實現shell

232549578.jpg

二、tac(將文本縱向倒置)數組

一般能夠合sed結合,將多個文本的最後一行或者多行替換掉ide

233513267.jpg

總結: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


test數據文件:
12 34
78 90
23 45

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
命令行

1 12 34
2 23 45
3 78 90
在最後執行命令,END中 asorti對數組a的下標進行排序,並把排序後的下標存入新生成的數組b中,並把數組a的長度賦值給變量l。

假如要作數組value排序呢?asorti相似的一個方法asort能夠實現,例子以下
unix

awk '{a[$1]=$2}END{slen=asort(a,b);for(i=1;i<=slen;i++) print i"\t"a[i]"\t"b[i]}' test
1 34
2 45
3 90

我的認爲此函數用處很少,由於將原來的數組下標給丟掉了,若是想對value排序,又不丟掉數組下標,將awk的結果用shell下的sort命令實現更加人性化,可能多了一層管道,效率會相對低一些。cdn

總結下awk的兩排序函數區別:

asort 是對數組的值進行排序,而且會丟掉原先鍵值;
asorti是對數組的下標進行排序。

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的做用是再次執行命令行處理,也就是說,對一個命令行,執行兩次命令行處理。

一個極其簡單的例子能夠說明

151438922.jpg

(詳情可參照該連接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(提取文件不一樣部分)

遇到些更實用的方法會持續更新的哦.......j_0055.gif

相關文章
相關標籤/搜索