1.查空行

使用Linux命令查询file.txt中空行所在的行号
file1.txt数据准备

1
2
3
4
5
6
itheima itheima

itcast
123

itheima

1
awk '/^$/{print NR}' file1.txt

2.求一列的和

有文件file2.txt内容如下,使用Linux命令计算第二列的和并输出

1
2
3
张三 40
李四 50
王五 60

1
awk '{sum+=$2} END{print "求和: "sum}' file2.txt

3.检查文件是否存在

根据文件是否存在执行不同逻辑


1
if [ -e /root/file1.txt ]; then  echo "文件存在"; else echo "文件不存在"; fi

4.数字排序

用shell写一个脚本,对文本中无序的一列数字排序
file3.txt文件内容

1
2
3
4
5
6
7
8
9
10
9
8
7
6
5
4
3
2
10
1

1
sort -n file3.txt | awk '{sum+=$1; print $1} END{print "求和: "sum}'

5.搜索指定目录下文件内容

查找当前文件夹(/root)下所有的文本文件内容中包含有字符”123”的文件名称


1
grep -r "123" /root | cut -d ":" -f 1| sort -u

6.批量生成文件名

批量生产指定数目的文件,文件名采用”纳秒”命名


脚本代码file4.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
read -t 30 -p "请输入创建文件的数目:" n
test=$(echo $n | sed 's/[0-9]//g') #检测非数字输入
if [ -n "$n" -a -z "$test" ] #检测空输入
then
for ((i=0;i<$n;i=i+1 ))
do
name=$(date +%N)
[ ! -d ./temp ] && mkdir -p ./temp
touch "./temp/$name"
echo "创建 $name 成功!"
done
else
echo "创建失败"
exit 1
fi

7.批量改名

/root/temp目录下所有文件名重命名为”旧文件名-递增数字”
重命名命令

1
rename 旧文件名 新文件名 旧文件所在位置

脚本代码file5.sh

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
filenames=$(ls /root/temp)
number=1
for name in $filenames
do
printf "命令前:%s" ${name}
newname=${name}"-"${number}
rename $name ${newname} /root/temp/*
let number++ #每个改名后的文件名后缀数字加1
printf "重命名后:%s \n" ${newname}
done

8.批量创建用户

根据users.txt中提供的用户列表,一个名一行,批量添加用户到linux系统中
数据准备users.txt

1
2
user1
user2

添加用户命令

1
useradd 用户名

设置每个用户密码默认密码

1
echo "123456" | passwd --stdin 用户名

image-20200713092318381


脚本代码file6.sh

1
2
3
4
5
6
7
8
#!/bin/bash
ULIST=$(cat /root/users.txt) ##/root/users.txt  里面存放的是用户名,一个名一行
for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &>/dev/null
[ $? -eq 0 ] && echo "$UNAME用户名与密码添加初始化成功!"
done

9.筛选单词

问题: 根据给出的数据输出里面单词长度大于3的单词
数据准备

1
I may not be able to change the past, but I can learn from it.

shell脚本file7.sh

1
echo "I may not be able to change the past, but I can learn from it." | awk -F "[ ,.]" '{for(i=1;i<NF;i++){ if(length($i)>3){print $i}}}'

10.单词及字母去重排序

  1. 按单词出现频率降序排序!
  2. 按字母出现频率降序排序!

file8.txt 文件内容

1
No. The Bible says Jesus had compassion2 on them for He saw them as sheep without a shepherd. They were like lost sheep, lost in their sin. How the Lord Jesus loved them! He knew they were helpless and needed a shepherd. And the Good Shepherd knew He had come to help them. But not just the people way back then. For the Lord Jesus knows all about you, and loves you too, and wants to help you.

按照单词出现频率降序

1
awk -F "[,. ]+" '{for(i=1;i<=NF;i++)S[$i]++}END{for(key in S)print S[key],key}' file8.txt |sort -rn|head

按照字符出现频率降序前10个

1
awk -F "" '{for(i=1;i<=NF;i++)S[$i]++}END{for(key in S)print S[key],key}' file8.txt |sort -rn|head

11.扫描网络内存活主机

扫描192.168.56.1到192.168.56.254之间ip的是否存活,并输出是否在线

服务器ip存活分析

1
2
ping ip地址 -c 2
# 如果ip地址存活发送2个数据包会至少接收返回1个数据包

效果如图


完整脚本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
count=0
for i in 192.168.56.{1..254}
do
# 使用ping命令发送2个包测试, 并获取返回接收到包的个数
receive=$(ping $i -c 2|awk 'NR==6{print $4}')
# 接收返回包大于0 说明主机在线
if [ ${receive} -gt 0 ]
then
echo "${i} 在线"
((count+=1))
else
echo "${i} 不在线"
fi

done
echo "在线服务器有:"$count"个"

12.MySQL分库备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
user=root #用户名
pass=root #密码
backfile=/root/mysql/backup #备份路径
[ ! -d $backfile ] && mkdir -p $backfile #判断是否有备份路径
cmd="mysql -u$user -p$pass" #登录数据库
dump="mysqldump -u$user -p$pass " #mysqldump备份参数
dblist=`$cmd -e "show databases;" 2>/dev/null |sed 1d|egrep -v "_schema|mysql"` #获取库名列表
echo "需要备份的数据列表:"
echo $dblist
echo "开始备份:"
for db_name in $dblist #for循环备份库列表
do
printf '正在备份数据库:%s' ${db_name}
$dump $db_name 2>/dev/null |gzip >${backfile}/${db_name}_$(date +%m%d).sql.gz #库名+时间备份打包至指定路径下
printf ',备份完成\n'
done
echo "全部备份完成!!!"

运行效果

13.MySQL数据库分库分表备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/sh
user=root #用户名
pass=root #密码
backfile=/root/mysql/backup #备份路径
[ ! -d $backfile ] && mkdir -p $backfile #判断是否有备份路径
cmd="mysql -u$user -p$pass" #登录数据库
dump="mysqldump -u$user -p$pass " #mysqldump备份参数
dblist=`$cmd -e "show databases;" 2>/dev/null |sed 1d|egrep -v "_schema|mysql"` #获取库名列表
echo "需要备份的数据列表:"
echo $dblist
echo "开始备份:"
for db_name in $dblist #for循环备份库列表
do
printf '正在备份数据库:%s\n' ${db_name}
tables=`mysql -u$user -p"$pass" -e "use $db_name;show tables;" 2>/dev/null|sed 1d`
for j in $tables
do
printf '正在备份数据库 %s 表 %s ' ${db_name} ${j}
$dump -B --databases $db_name --tables $j 2>/dev/null > ${backfile}/${db_name}-${j}-`date +%m%d`.sql
printf ',备份完成\n'
done


printf '数据库 %s 备份完成\n' ${db_name}
done
echo "全部备份完成!!!"

运行效果