1.编写SHELL脚本,将文件系统使用率超过80%的目录输出
#!/bin/bash
df | sed 's/%//' | awk '$5>=80'
2.使用sed命令在文件file中第一行和第三行之后添加字符串"hello world"
(1)sed '1s/$/hello world/;3s/$/hello world/' x.txt
(2)sed '1a hello world;3a hello world' x.txt
3.设计一个shell程序,在/userdata目录下建立50个目录.即user1-user50并设置每个目录的权限,所有者权限为:读写执行,所属组权限为:读,执行,其他人:只读
#!/bin/bash
for i in {1..50}
do
mkdir -p /userdata/user$i
chmod 754 /userdata/user$i
done
4.使用ping命令编写脚本来查询一组IP地址检测他们是否处于活跃的状态.要求(range:192.168.1.200-192.168.1.220,一个IP发送4的ping包,ping的过程不能输出到终端)
#!/bin/bash
for i in {200..220}
do
ping -c 4 -i 0.2 -W 1 192.168.1.$i &> /dev/null
if [ $? -eq 0 ];then
echo "192.168.1.$i is up"
else
echo "192.168.1.$i is down"
fi
done
5.编写SHELL脚本将/usr/local/test 目录下大于100k的文件转移到/tmp目录下
#!/bin/bash
find /usr/local/test -size +100k -exec cp {} /tmp/ \;
6.查询/var/log/secure日志里八点到九点的日志信息
awk '$3>="08:00:00"&&$3<="09:00:00"' /var/log/secure
7.统计系统中使用bash作为登录shell的用户总个数
a.预处理时赋值变量x=0
b.然后逐行读入/etc/passwd文件,如果发现登录的shell是/bin/bash则加1
c.全部处理完毕后,输出x的值
#awk 'BEGIN{x=0}/bash$/{x++}END{print x}' /etc/passwd
(awk常用内置变量:
$0 文本当前行的全部内容
$1 文本的第1列
$2 文件的第2列
$3 文件的第3列,依此类推
NR 文件当前行的行号
NF 文件当前行的列数(有几列)
)
8.格式化输出/etc/passwd文件
要求:格式化输出passwd文件内容时,要求第一行为列表标题,中间打印用户的名称 UID 家目录信息,最后一行提示一共处理文本的总行数
awk -F: 'BEGIN{print "User\tUID\tHome"}\
{print $1 "\t" $3 "\t" $6}\
END{print "Total",NR,"lines."}' /etc/passwd
9.统计/etc/passwd文件中UID大于1000的用户个数:
awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd
10.统计/etc/passwd文件中登录Shell是“/bin/bash”的用户个数
awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd
- 分别统计/etc/passwd文件中登录Shell是“/bin/bash”、 登录Shell不是“/bin/bash”的用户个数:
awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd
- AWK数组
数组的语法格式(可以存储多个值的变量)
(1)定义数组的格式:数组名【下标】=元素值
(2)调用数组的格式:数组名【下标】
(3)遍历数组的用法:for(变量 in 数组名){print 数组名【变量】}
#################################################################
举个栗子:#awk ‘BEGIN{a[0]=11;a[1]=88;print a[1],a[0]}’ (88 11)
#awk ‘BEGIN{a++;print a}’ (1)
#awk ‘BEGIN{a0++;print a0}’ (1)
#awk ‘BEGIN{a[0]++;print a[0]}’
[root@svr5 ~]# awk ‘BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}’
注意,awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号:
[root@svr5 ~]# awk 'BEGIN{a[“hehe”]=11;print a[“hehe”]}'11
#################################################################
13.问题:
(1)分析web日志的访问量排名,要求获得客户机的IP、访问次数,并且按照访问次数排名
(2)在分析Web日志文件时,每条访问记录的第一列就是客户机的IP地址,其中会有很多重复的IP地址。因此只用awk提取出这一列是不够的,还需要统计重复记录的数量并且进行排序。
通过awk提取信息时,利用IP地址作为数组下标,每遇到一个重复值就将此数组元素递增1,最终就获得了这个IP地址出现的次数。针对文本排序输出可以采用sort命令,相关的常见选项为-r、-n、-k。其中-n表示按数字顺序升序排列,而-r表示反序,-k可以指定按第几个字段来排序。
1)提取IP地址及访问量
[root@svr5 ~]# awk '{ip[$1]++} \
> END{for(i in ip) {print ip[i],i }}' /var/log/httpd/access_log
4 127.0.0.14.
17 192.168.4.55.
13 192.168.4.1106. .. ..
2)对第1)步的结果根据访问量排名
[root@svr5 ~]# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log | sort -nr
17 192.168.4.5
13 192.168.4.110
4 127.0.0.1
```