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因为语法不严格,所以相比高级语言非常灵活,但是这种灵活需要耗费大量的精力去掌握

posted @ 2023-02-13 05:13  风尘断  阅读(25)  评论(0)    收藏  举报