shell练习
#!/bin/bash ################################################## #根据输入的软件名,杀死全部含有软件名的进程 #这里利用的awk,模拟psgrep ################################################## # 如果参数不是一个直接退出 if [ $# -ne 1 ]; then echo "Input wrong.." exit 2 fi for i in $(ps aux | awk '$0 ~/$1/ {print}' | awk '$0 !~/awk/ {print $2}'); do kill -9 "$i" done
非常经典的统计字频的shell脚本
cat file.txt | awk '{for(i=1;i<=NF;i++)arr[$i]++}END{for(j in arr){printf("%s %d\n",j,arr[j])}}' | sort -r -n -k 2
awk 中变量不需要加$,除了awk自身的$0,$1..除外.
for(i=1;i<=NF;i++)arr[$i]++
$1...$NF当前行所有的记录;
arr[$i]因为$i不一定是数字,所以arr是关联数组;
arr[$i]++以$i为键,并把存储的值+1
for(j in arr)这是因为awk变量for可以直接用
普通shell则为for j in ${!arr[*]};${!arr[*]}表示arr数组的所有键,如果是普通数组则为0,1,2...
j表示arr的键,arr[j]表示键对应的值
sort -r -n -k 2
sort排序[以行为单位] -r 反转排序,即逆序 -n当作数字,因为sort默认是按照字符排序的 -k指定排序字段,-k 2即表示以第二列的内容作为排序的依据
猜大小
#!/bin/bash target=$(($RANDOM % 100 + 1)) echo target="${target}" while read -p "Please input:" input; do if [ $target -eq $input ]; then echo "You are right!" break elif [ $target -gt $input ]; then echo "You input is small, plese input a bigger one!" else echo "You input is big, please input a smaller one!" fi done
$RANDOM RANDOM 是linux的系统变量
文件转置
#!/bin/bash # 文件行列转置 # 11 12 13 # 21 22 23 # 得到 # 11 21 # 12 22 # 13 23 awk '{for(i=1;i<=NF;i++)arr[i]=arr[i]" "$i}END{for(i=1;i<=NF;i++)print arr[i]}' # 这个shell的瑕疵在于如果最后一行的列数少结果就有问题
# 解决办法就是定义一个变量,得到最大的列数 awk '{if(NF>max)max=NF;{for(i=1;i<=NF;i++)arr[i]=arr[i]" "$i}}END{for(i=1;i<=max;i++)print arr[i]}'
awk '{for(i=1;i<=NF;i++)arr[i]=arr[i]" "$i}END{for(j in arr)print arr[i]}' # 这是一个错误的shell,因为shell数组for迭代得到的是无序的
awk '{for(i=1;i<=NF;i++)arr[i,NR]=$i}END{for(i=1;i<=NF;i++){for(j=1;j<=NR;j++)printf arr[i]" ";print}' # 这是shell二维数组的形式,结果是正确的,但是空格有多余,另外也有最大列不是最后一行的问题
shell因为语法不严格,所以相比高级语言非常灵活,但是这种灵活需要耗费大量的精力去掌握

浙公网安备 33010602011771号