shell常见脚本

-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真。
filename1 -ot filename2 如果 filename1比 filename2旧,则为真。
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于

1.打印指定目录下的最大文件大小和名称:

#!/bin/bash
a=0 shell语言约束性不强,没有声明字符类型
b=0
name="cs" 三个变量
for filename in $(ls /home/hadoop/ff) for循环,filename也是变量
do
a=$(ls -l /home/hadoop/ff/$filename |awk '{print $5}') 给a赋值,或者加命令的话是加反撇号:a=` 命令语句 ` 两种方式加都可以,一般用:$( 命令语句)
if test $a -gt $b
then b=$a;
name=$filename
fi
done
echo $name
echo $b

赋权:chomd 777 脚本.sh

awk '{print $5}' 把结果按照默认空格截取,取第5个部分
awk是截取,如果没有声明分隔符,默认按照空格截取

在shell环境中查询hadoop下的文件大小脚本:
#!/bin/bash
a=0
b=0
name="cs"
for filename in $(hadoop fs -lsr /user/hive/warehouse |awk '{print $8}')
do
a=$(hadoop fs -ls $filename |awk '{print $5}' |sed '/`$/d')
if test $a -gt $b
then b=$a;
name = $filename
fi
done
echo $name
echo $b

4.查看网卡流量: --只是用来做判断而已。 因为是分布式系统,每台机器都会互相传数据,如果打到红线区,说明服务器压力特别大,需要做负载均衡,或者加节点,或者调yarn,业务分配

#!/bin/bash
while : ; do
time=`date +%m"-"%d" "%k":"%M` --linux下约束时间格式
day=`date +%m"-"%d`
rx_before=`ifconfig eth0|sed -n "8"p|awk '{print $2}'|cut -c 7-` --查看网卡情况
tx_before=`ifconfig eth0|sed -n "8"p|awk '{print $6}'|cut -c 7-`
sleep 2
rx_after=`ifconfig eth0|sed -n "8"p|awk '{print $2}'|cut -c 7-`
tx_after=`ifconfig eth0|sed -n "8"p|awk '{print $6}'|cut -c 7-`
rx_result=$[(rx_after-rx_before)/1024]
tx_result=$[(tx_after-tx_before)/256]
echo "$time Now_In_Speed: "$rx_result"kbps Now_OUt_Speed: "$tx_result"kbps"
sleep 2
done

由于ifconfig只能在root用户下直接操作,所以脚本要在root用户下编写执行
hadoop用户执行方式:/sbin/ifconfig eth0
sed 可以截取行,而awk只能在一行中进行截取,awk -F: '{print $2}' 按照:截取,取第二部分
`ifconfig eth0|sed -n "8"p|awk '{print $2}'|cut -c 7-`
----> ifconfig eth0|sed -n "8"p|awk `{print $2}` |awk -F: `{print $2}`

15.假设有 10 台主机,H1 到 H10,在开启 SSH 互信的情况下,编写一个或多个脚本实现
在所有的远程主机上执行脚本的功能。 例如:"ls -l /usr/cs"
#!/bin/bash
arr=(h101 h102 h103)
for a in ${arr[@]} @ 是通配符(角标位)从第一个到最后一个,是反复执行的意思
do
echo $a
ssh hadoop@$a -p 22 'ls -l /usr/cs' -p 后面端口号 后面是执行的命令
done
echo "bye"

7.循环输入到文件: eorr 1 8:00 e1 e2>abc 9:00 e3 e1 e2 e3>abc
#!/bin/bash
for name in `cat /etc/passwd |cut -d ":" -f 1`
do
echo $name
done > 2.txt

8.设置输入超时 (输入多个参数 空格隔开):
#!/bin/bash
if read -t 5 -p "you name :" name1 name2
then
echo "5 miao nei";
else
echo "5 miao wai";
fi
echo $name1
echo $name2

9.将错误删除到文件而非屏幕:

#!/bin/bash
ls /usr/wwd 2> 3.txt //没有wwd目录

[root@nginx shell]# cat 3.txt
ls: 无法访问/usr/wwd: 没有那个文件或目录

10.以变量方式接收函数值: 实际上实现的是计算器的功能
#!/bin/bash
a() {
read -p "input:" num
echo `expr $num \* 2`
}
re=`a`
echo $re

反引号引上a 代表a是一个函数

11.接收值保存为array 然后遍历:
#!/bin/bash
newarray=(`echo "$@"`)
echo ${#newarray[@]}
#方法一:
for((i=0;i<${#newarray[@]};i++))
do
echo ${newarray[i]}
done
方法二:
for a in ${newarray[@]}
do
echo $a
done

12.函数返回数组:
#!/bin/bash
function fun1 {

echo ${newarray[@]}

}
newarray=(wang zeng xu)
twoarray=`fun1`

for i in ${twoarray[@]}
do
echo $i
done

13.正则表达式:

cat 2.txt |sed 's\sh\wzx\' s命令将第一个区间内的内容替换为第二个区间内的内容(后面的斜杠必须有,如果想将第一个区间内的内容全部替换为第二个区间内的内容,则后面加\g)

^ : echo "hello wzx" |sed '/^hello/p' 必须以hello开头的

$ : echo "hello wzx" |sed '/wzx$/p' 必须以wzx结尾的

可组合使用 : echo "hello wzx" |sed '/^hello wzx$/p' 必须以hello开头的以wzx结尾的

cat 2.txt |sed '/^$/p' : ^和$之间无内容 可过滤出空白行

. : cat 3.txt |sed -n '/.at/p' at单词前边必须有字符 可以是任意字符 (空格也属于字符)

[] 字符组: cat 3.txt |sed -n '/[ch]at/p' 打印出包含cat 或者包含hat的行
echo "yes" |sed -n '/[Yy]es/p' 打印Yes 或者yes的行 echo "yes" |sed -n '/[Yy][Ee][Ss]/p' 可以使用多个

cat 4.txt |sed -n '/[124]/p' 打印出包含1或2或4的行 (可在任意位置) 可简写为:cat 4.txt |sed -n "/[1-24-4]/p"

cat 4.txt |sed -n '/[1-4]/p' 打印出包含1-4之间数字的行

cat 3.txt |sed -n '/[^ch]at/p' 不是cat或hat的其他带有at的行 但at前必须有字符 不能以at开头

echo "ik" |sed -n '/ie*k/p' 输出 ik *表示e字符出现0次或1次或多次

遍历PATH变量下的各目录下的文件数量
#!/bin/bash
mypath=`echo $PATH |sed 's/:/ /g'`
count=0
for fp in $mypath
do
check=`ls $fp`
for item in $check
do
count=`expr $count + 1`
done
echo "$fp - $count"
count=0
done
14.修改指定目录下的所有文件内容:
[root@CM cs]# ./cs.sh /usr/cs/cs
将$HADOOP_HOME修改为/usr/home/
#!/bin/bash

for f in `ls $1`
do
file=$1/$f
echo $file
sed -i "s#\$HADOOP_HOME#/usr/home/#g" $file
done



16.将指定目录下大于5000的文件移动到tmp目录下:
#!/bin/bash

for f in `ls -l $1 |awk '$6>5 {print $10}'`
do
path=$1/$f
mv $path /tmp
done

*********
[hadoop@hadoop111 ~]$ ls -l ff|wc -l
显示目录下所有行

[hadoop@hadoop111 ~]$ ls -l ff|grep "^-"|wc -l
显示目录下所有文件数(grep "^-" 过滤保留文件)

[hadoop@hadoop111 ~]$ ls -lR ff|grep "^d"|wc -l
显示目录下所有子目录数(grep "^-" 过滤保留目录)
*********

17.bc非整数运算:
效率: let > expr > bc
a=1.5
b=2.89
c=`echo "scale=3;$a*$b"|bc` #scale指定小数位
echo $c

gawk浮点运算
a=1.5
b=2.89
var=`echo "$a $b"|gawk '{printf("%.3f\n",$1+$2)}'`
echo $var






18.删除视频目录下昨天创建的文件:
#!/bin/bash
d=`date +"%d"`
for f in `ls /usr/local/video`
do
temp=`echo $f |cut -c 7-8`
if [[ "$temp" < "$d" ]]
then
rm -rf /usr/local/video/$f
fi
done
exit 0


记录输入的值
read -t 5 -s -p "input: " bir
echo $bir

date | tee -a 1.txt 既输出到屏幕又追加到文件

./cs.sh & 加 & 可在后台运行 返回一个PID 使用 jobs命令查看运行的后台任务

curl下载文件

排序: -n -rn
ll ./ |awk '{print $5}' |sort -rn

其他sh文件引入:
. /usr/cs/shell/cs5.sh 格式: . 空格 文件名

打印出昨天年月日
echo `date -d "yesterday" +"%Y%m%d"`

打印当前日期和时间
echo `date +"%m/%d/%Y %k:%M:%S"`

shell统计nginx日志中访问前十的IP:
cat access.log |gawk '{a[$1]++} END {for(b in a) print b"\t"a[b]}' |sort -k 2 -rn |head -n 10

打印出包含指定字符并不包含指定字符的行:
grep -E 'baohan' 1.txt |grep -v 'bubaohan'

指定范围且不包含sh字符的
ls -l |gawk '{print $9}' |sed -n '2,8p' |grep -v "sh"

stringZ=abcABC123ABCabc

a=`echo ${stringZ//abc/wzx}` 将所有的abc替换为wzx
b=`echo ${stringZ/abc/wzx}` 将第一个abc替换为wzx

declare -f 常量 -i 整形变量
$RANDOM 随机数

echo "1.5 2.5" |gawk '{printf("%.2f\n",$1*$2)}' #gawk浮点运算保留2位小数 四舍五入


比较有意思的 break 2 用法 停掉2层循环


2.判读输入的文件属于什么类型:
if [ -d $1 ]
then echo "目录"
elif [ -f $1 ] then echo "普通文件"
#elif [ -c $1 ] then echo "字符特殊文件"
elif [ -b $1 ] then echo "块特殊文件"
else echo "不认识"
fi

$1 是在执行过程中输入的目录 类似执行mr 的时候args0或1,可以指定一个变量

3.计算器脚本:
#!/bin/bash
case $2 in
+) echo "$1 + $3 = $(expr $1 + $3)"
;;
-) echo "$1 - $3 = $(expr $1 - $3)"
;;
*) echo "$1 * $3 = $(expr $1 \* $3)"
;;
/)
if [ $3 = 0 ]
then echo "除数不能为0"
exit
else
echo "$1 / $3 = $(expr $1 / $3)"
fi
;;
*) echo "read error"
esac

执行脚本:sh 脚本 $1 $2 $3 ($2为运算符)
如:1 + 1

5.打印出所有用户

#!/bin/bash
accounts=`cat /etc/passwd | cut -d':' -f1`
for account in $accounts
do
declare -i i=$i+1
echo "The $i account is $account"
done

6.遍历文件 很少用,大数据平台,用这个不合适
#!/bin/bash

#方法1:
while read line --把数据读出来到显示界面
do
echo $line
done < 1.txt
unset $line

#方法2:
cat 1.txt |while read line
do
echo $line
done


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值