面试题1:已知test.txt文件里含有如下域名:

www.etiantian.org
bbs.etiantian.org
www.etiantian.org
blog.etiantian.org
www.etiantian.org
www.etiantian.org
blog.etiantian.org

统计每个域名出现的次数,并且按照从多到少排序。

uniq 去重 -c计数
sort
[root@web01 /server/scripts]# sort test.txt|uniq -c|sort -rn
4 www.etiantian.org
2 blog.etiantian.org
1 bbs.etiantian.org

[root@web01 /server/scripts]# awk '{++S[$1]} END {for(key in S) print S[key],key}' test.txt|sort -rn

第一篇:详解linux netstat输出的网络连接状态信息
​​​ http://oldboy.blog.51cto.com/2561410/1184139​​​ 第二篇:庖丁解牛获取连接状态数的awk数组命令
http://oldboy.blog.51cto.com/blog/2561410/1184165
第三篇:awk数组命令经典生产实战应用拓展
http://oldboy.blog.51cto.com/blog/2561410/1184177
第四篇:老男孩培训第八节课前awk考试题案例(门户面试题解答)
http://oldboy.blog.51cto.com/2561410/1184206
第五篇:linux生产服务器有关网络状态的优化措施(告一段落)
http://oldboy.blog.51cto.com/2561410/1184228

范例10_10:写一个Shell脚本解决类DDOS攻击的生产案例

请根据web日志或者系统网络连接数,监控当某个IP并发连接数,若短时内PV达到100,即调用防火墙命令封掉对应的IP。

防火墙命令为:iptables -I INPUT -s IP地址 -j DROP。
[root@web01 /server/scripts]# cat ctrl_ddos1.sh 
#!/bin/bash
##############################################################
# File Name: ctrl_ddos.sh
# Version: V1.0
# Author: oldboy
# Organization: www.oldboyedu.com
##############################################################
jisuan(){
awk -F "[ :]+" '/ESTABLISHED/{print $(NF-3)}' netstat.log|sort|uniq -c|sort -rn|head -10 >/tmp/ip.log
while read line
do
ip=`echo $line|awk '{print $2}'`
count=`echo $line|awk '{print $1}'`
if [ $count -gt 10 ] && [ `iptables -nL|grep "$ip"|wc -l` -lt 1 ]
then
echo "$ip
iptables -I INPUT -s $ip -j DROP
else
echo "$ip
fi
done</tmp/ip.log
}
main(){
while true
do
jisuan
sleep 5
done
}
for 变量名 in 变量取值列表
do
指令...
done


for n in 1 2 3 4 5
do
echo $n
done
for n in {1..5}
do
echo $n
done
for n in `seq 5`
do
echo $n
done

第二种for循环语句称之为C语言型for循环语句,其语法结构如下:

for((exp1;exp2;exp3))
do
指令...
done


for ((i=1;i<=5;i++))
do
echo $i
done

echo ====================
i=1
while ((i<=5))
do
echo $i
((i++))
done

随机数:

1、openssl随机数

[root@web01 /server/scripts]# openssl rand -base64 8|cut -c 1-8
M7R3cvSl
[root@web01 /server/scripts]# openssl rand -base64 8|cut -c 1-8

2、简单random随机数

[root@web01 /server/scripts]# echo $RANDOM
28127

RANDOM Each time this parameter is referenced, a random integer between 0 and 32767 is generated. The
sequence of random numbers may be initialized by assigning a value to RANDOM. If RANDOM is
unset, it loses its special properties, even if

3、时间随机数

[root@web01 /server/scripts]# date +%N
783556744
[root@web01 /server/scripts]# date +%N|md5sum|cut -c 5-13

4、

[root@web01 /server/scripts]# head /dev/urandom|cksum|md5sum
f448a3b537ca1d8883079efc12705282 -
[root@web01 /server/scripts]# head /dev/urandom|cksum|md5sum

5、

[root@web01 /server/scripts]# cat /proc/sys/kernel/random/uuid
4c2c10a8-e340-48e8-a61e-65b052fe1ea8
[root@web01 /server/scripts]# cat /proc/sys/kernel/random/uuid

6、

mkpasswd命令依赖于数据包expect,因此必须通过yum install expect

使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下:

[root@oldboy scripts]# ls /oldboy
apquvdpqbk_oldboy.html mpyogpsmwj_oldboy.html txynzwofgg_oldboy.html
bmqiwhfpgv_oldboy.html mtrzobsprf_oldboy.html vjxmlflawa_oldboy.html
jhjdcjnjxc_oldboy.html qeztkkmewn_oldboy.html
jpvirsnjld_oldboy.html ruscyxwxai_oldboy.html


touch apquvdpqbk_oldboy.html
touch bmqiwhfpgv_oldboy.html
touch jhjdcjnjxc_oldboy.html
touch

1、10位小写字母随机数:

[root@web01 /server/scripts]# openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11

2、命令行手工搞定一个

[root@web01 /server/scripts]# random=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11`
[root@web01 /server/scripts]# echo $random
qvnprjvpey
[root@web01 /server/scripts]# echo $random
qvnprjvpey
[root@web01 /server/scripts]# random=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11`
[root@web01 /server/scripts]# echo $random
ftlhpzuvcg
[root@web01 /server/scripts]# touch ${random}_oldboy.html
[root@web01 /server/scripts]# random=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11`
[root@web01 /server/scripts]# touch ${random}_oldboy.html

3、搞定多个脚本for循环

[root@web01 /server/scripts]# vim 19_1_1.sh
#!/bin/bash
##############################################################
# File Name: 19_1_1.sh
# Version: V1.0
# Author: oldboy
# Organization: www.oldboyedu.com
##############################################################
Path=/oldboy
[ -d $Path ] || mkdir $Path
for n in {1..10}
do
random=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11`
touch $Path/${random}_oldboy.html
done

[root@web01 /server/scripts]# sh 19_1_1.sh
[root@web01 /server/scripts]# ls /oldboy/

19.1.2 企业Shell面试题2:批量改名特殊案例
将上面试题19.1.1中结果文件名中的oldboy字符串全部改成oldgirl(最好用for循环实现),并且将扩展名html全部改成大写HTML。
三种方法实现:

1、先命令行处理一个

[root@web01 /oldboy]# file1=kfixfkghqz_oldboy.html
[root@web01 /oldboy]# mv $file1 ${file1/oldboy.html/oldgirl.HTML}

2、脚本处理多个
方法1:

Path=/oldboy
[ -d $Path ] || mkdir $Path
cd $Path
for file1 in `ls`
do
mv $file1 ${file1/oldboy.html/oldgirl.HTML}
done

方法2:
rename专业改名

[root@web01 /oldboy]# rename "oldgirl.HTML" "oldboy.html" *HTML
[root@web01 /oldboy]# ls
fzewmfbowb_oldboy.html kfixfkghqz_oldboy.html qaxuezrdyh_oldboy.html vkftijhssz_oldboy.html
ibcmutcmyj_oldboy.html ovqxxevhlw_oldboy.html rkoxkozsfs_oldboy.html
inpdcqsmfo_oldboy.html paoreutqqd_oldboy.html sksdayeamk_oldboy.html
[root@web01 /oldboy]# rename "oldboy.html" "oldgirl.HTML" *html
[root@web01 /oldboy]# ls

方法3:

mv fzewmfbowb_oldboy.html fzewmfbowb_oldgirl.HTML
mv fzewmfbowb_oldboy.html fzewmfbowb_oldgirl.HTML
mv fzewmfbowb_oldboy.html fzewmfbowb_oldgirl.HTML

[root@web01 /oldboy]# ls *.html|awk -F '_' '{print "mv",$0,$1"_oldgirl.HTML"}'
mv fzewmfbowb_oldboy.html fzewmfbowb_oldgirl.HTML
mv ibcmutcmyj_oldboy.html ibcmutcmyj_oldgirl.HTML
mv inpdcqsmfo_oldboy.html inpdcqsmfo_oldgirl.HTML
mv kfixfkghqz_oldboy.html kfixfkghqz_oldgirl.HTML
mv ovqxxevhlw_oldboy.html ovqxxevhlw_oldgirl.HTML
mv paoreutqqd_oldboy.html paoreutqqd_oldgirl.HTML
mv qaxuezrdyh_oldboy.html qaxuezrdyh_oldgirl.HTML
mv rkoxkozsfs_oldboy.html rkoxkozsfs_oldgirl.HTML
mv sksdayeamk_oldboy.html sksdayeamk_oldgirl.HTML
mv vkftijhssz_oldboy.html vkftijhssz_oldgirl.HTML
[root@web01 /oldboy]#
[root@web01 /oldboy]#
[root@web01 /oldboy]# ls *.html|awk -F '_' '{print "mv",$0,$1"_oldgirl.HTML"}'|bash
[root@web01 /oldboy]# ls
#!/bin/sh
Filename=_oldgirl.HTML
Dirname="/oldboy"
cd $Dirname||exit 1
for n in `ls`
do
name=$(echo ${n}|awk -F '_' '{print $1}')
mv $n ${name}${Filename}
done

19.1.1 企业Shell面试题1:批量生成随机字符文件名案例

使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含oldboy固定字符串加10个随机小写字母,名称示例如下:

[root@oldboy scripts]# ls /oldboy

19.1.3 企业Shell面试题3:批量创建特殊要求用户案例

批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机数,要求字符和数字等混合)。
不用for循环的实现思路:http://user.qzone.qq.com/49000448/blog/1422183723
解答:
本题的详细答案见第11章范例11_14,此处仅作为Shell案例集中收集整理。

范例12_4:已知下面的字符串是通过将RANDOM随机数采用md5sum加密后任意取出连续10位的结果,请破解这些字符串对应的md5sum前的数字?
4fe8bf20ed

19.1.8 企业Shell面试题8:筛选符合长度的单词案例

利用bash for循环打印下面这句话中字母数不大于6的单词(某企业面试真题)。
I am oldboy teacher welcome to oldboy training class
解答:
本题的详细答案见第13章范例13_4,此处仅作为Shell案例集中收集整理。

1)字符串长度

[root@web01 /server/scripts]# oldboy="I am oldboy."
[root@web01 /server/scripts]# echo ${#oldboy}
12
[root@web01 /server/scripts]# echo ${oldboy}|wc -L
12
[root@web01 /server/scripts]# expr length "${oldboy}"
12
[root@web01 /server/scripts]# echo $oldboy|awk '{print length}'
12
[root@web01 /server/scripts]# echo $oldboy|awk '{print length($0)}'
12

chars="I am oldboy teacher welcome to oldboy training class"
for word in $chars
do
if [ ${#word} -le 6 ]
then
echo $word
fi
done

[root@web01 /server/scripts]# sh 19_1_8.sh

19.1.1 企业Shell面试题1:批量生成随机字符文件名案例

使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含oldboy固定字符串加10个随机小写字母,名称示例如下:

[root@oldboy scripts]# ls /oldboy