一、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(提取文件不一样部分)