2019.4.25
按单词出现频率降序排序!
#!/bin/bash
#读取文件,统计文件中单词频率和字符频率
if [[ $# -ne 1 ]];then
echo "please input one correct param"
exit
fi
tr ',.?' ' ' <$1 |xargs -n 1|sort|uniq -c|sort -rn
#tr 用来替换,该例中将,.?替换为空格
#<$1 <是输入重定向符,就是将s1的内容作为标准输入重定向到tr;“linux中,没启动一个命令,就会打开三个文件:stdin、stdout、stderr,默认是输出到这三个文件的,当我们有特殊需求时就可以进行所谓的重新定向”
#以上两步最终将文件中的字符?.,替换为空格,方便我们后续对纯单词的操作
#xargs -n 1 参数转换,将标准输入转换为命令行参数,-n是限定参数个数,我们需要统计每个单词的频率,所以使用-n 1 限定每次传递1个
#sort 排序,这里的排序是为了后面的uniq,默认是空格作为界定符,如需指定加参数-t
#uniq -c 去重展示并且带参数-c 是统计每个单词重复的次数
#sort -rn 按照统计次数排序,默认升序,带-r是逆序,带-n是按数值排序,而不是按字符串排;不带-k参数,默认排第一列
======================
将4.24号题中结果文件名中的suning字符串全部改成shenyuqiang(最好用for循环实现),并且将扩展名html全部改成大写
#!/bin/bash
basepath=$(cd `dirname $0`;pwd)#获取脚本当前所在的目录
cd $basepath
for i in `ls *html`
do
name=`echo $i|cut -c 1-10`
echo $name
mv $name"_suning.html" $name"_shenyuqiang.HTML"
done
样例运行结果展示:
===============
关键字:判断字符串长度
利用bash for循环打印下面这句话中字母数不大于6的单词
I am oldboy teacher welcome to oldboy trainingclass
#!/bin/bash
var="I am oldboy teacher welcome to oldboy trainingclass"
for i in $var
do
if [ ${#i} -le 6 ];then #${#i} 判断字符串长度
echo $i
fi
done
样例运行结果展示:
2019.4.24
用户输入参数N,创建N个html文件,文件名包含10个随机数字字母,并以_suning结尾,如shenchen55_suning.html
关键字:正则、$RANDOM、cut -c、tr
#!/bin/bash
if [[ ! $1 =~ ^[1-9][0-9]*$ ]] || [[ $# -ne 1 ]];then #我只需要1个参数,判断$#是否ne 1;然后判断这个参数是不是大于0的纯数字。使用正则 ^表示起始匹配位;$表示结尾匹配位;
#*表示前面的表达式匹配0次或者多次,注意这里不能用+,因为10以内的数字我们是不需要匹配十位数的;=~用来判断变量是否匹配正则
echo "参数错误,请检查"
exit
fi
basepath=$(cd `dirname $0`;pwd) #该行没用 练手的
for i in `seq 1 $1`
do
touch `echo $RANDOM|md5sum|cut -c 1-10|tr 'a-z' 'A-Z'`_suning.html #这里在写时,我将它作为变量报错,就直接放到touch后了;cut -c表示根据字符区间来取;tr是‘翻译’的简写,作用是替换
done
样例运行结果展示:
2019.4.23
求1-100的和
关键字:两种for循环方式、变量相加、函数
#!/bin/bash
function sum(){
sum=0
#for((i=1;i<=100;i++))
for i in `seq 1 100`
do
sum=$[$sum+$i] #变量相加或者变量加某个常量的格式要记清 用中括号
done
echo $sum
}
sum #函数调用不加()
#输入一个数字n并计算1到这个数的总和。要求:如果这个数小于等于1,要求重新输入,直到输入大于1的数字为止;
关键字:if中多个条件判断、函数中for循环变量限制$1 $2…
#!/bin/bash
#输入一个数字n并计算1到这个数的总和。要求:如果这个数小于等于1,要求重新输入,直到输入大于1的数字为止;
if [ $# -ne 1 -o $1 -le 1 ];then #-o 或; -a 与; -le 小于等于
echo "please input again"
exit
fi
var=$1
function sum(){
sum=0
# for((i=1;i<=$var;i++)) #此处注意 使用函数时,for循环中变量不能直接使用$1 $2... 需提前进行定义,如var=$1;不使用函数无此限制
for i in `seq 1 $var` #该命令同样,不能直接使用$1 $2...
do
sum=$[$sum+$i]
done
echo $sum
}
sum
样例运行结果展示:
#输入一个数字n并计算1到这个数的总和。要求:如果这个数小于等于1,要求重新输入,直到输入大于1的数字为止;
关键字:if/while多个判断条件的写法
#!/bin/bash
function sum3(){
read -p "please input one number : " num
while [[ $num == *[!0-9]* ]] || [[ $num -le 1 ]] #if或者while判断多个条件时 可以使用-o -a o指or,a指and,例如 if [ a -gt b -a a -lt c ]:a大于b且a小于c
#也可以使用|| &&,注意要使用两个单独的中括号[[]],例如该脚本所写
do
read -p "输入的不是数字或者数字小于1,请重新输入: " num
done
sum=0
for i in `seq 1 $num`
do
sum=$[$sum+$i]
done
echo "1到$num的和是:"$sum
}
sum3
样例运行结果展示:
2019.4.22
批量ping主机连通性
!/bin/bash
if [ $# -ne 3 ];then
echo"必须输入三个参数:./ping.sh 10.37.2 144 190"
exit
fi
for((i=$2;i<=$3;i++)) #此处可以使用该命令代替 for i in `seq $2 $3`
do
echo $i
ping -c 2 $1"."$i &> /dev/null # ping -c 2 代表向目标主机发送2个测试包 ; &>/dev/null 类似于垃圾箱,将命令输出重定向到垃圾箱中
if [ $? = 0 ];then
echo "ping $1"."$i success"
else
echo -e "ping $1"."$i \033[31m failed \033[0m" # 该命令将failed处字体变为红色 \033[31m failed \033[0m
fi
done
样例运行结果展示:
2019.4.19
遍历某个文件中的所有行并打印
#!/bin/bash
txtName=$1 #变量定义时注意不要带空格;$符后面加数字 表示执行脚本时需传入几个参数
if [ $# -ne 1 ];then #if[]要注意带空格,$#指输入参数总数,-ne表示不等于
echo "缺失参数"
exit
fi
number=`wc -l $txtName | awk '{print $1}'` #wc -l会返回两列值 该命令取第一列,其将命令赋给变量,需使用反引号``
for((i=1;i<=$number;i++))
do
#echo $i
p=`sed -n $i'p' $txtName` #变量与常量拼接时,注意将常量进行字符化;sed -n 1p txtname 该命令取指定文件的第几行
# if [ ! -n "$p" ];then #! -n "变量" 判断变量是空
# if test -z "$p";then #也是判断变量是否为空,但是注意这种方式if不加[]
# echo "第$i行,该行为空"
# else
# echo $p
if test -n "$p";then #test -n :字符串的长度不为零则为真
echo $p
else
echo "第$i行,该行为空"
fi
done
样例运行结果展示:
===使用while read实现
#/bin/bash
if [ $# -ne 1 ];then
echo "缺失参数"
exit
fi
txtName=$1
lineNum=1
cat $txtName | while read line
do
echo 第$lineNum行:$line
lineNum=$[$lineNum+1]
done
样例运行结果展示: