坚持#第248天~awk和初级、中级测试

来源:互联网 发布:mac哪个粉底液好 编辑:程序博客网 时间:2024/06/07 00:09

awk数组:

awk -v是定义变量的var

关联数组:因为awk数组的下表可以是数值,也可以是字符串,遍历的是数组的下标

 

declare -a test1普通数组是-a

test2=(e0 e1 e2)

declare -A test2关联数组是-A

test2[zifuchuan1]=var1

test2[zifuchuan2]=var2

declare -A | grep test2

declare -A test3=([zifuchuan1]=”var1”[zifuchuan2]=”var2”)

declare -A test4=([A]=”aa”[B]=”bb”)

无法将普通(索引)数组转换为关联数组

要unset 数组名

echo ${test4[*]}

echo ${!test4[*]}

数组的遍历:

for(num in test4){print test4[num]}

 

awk支持下标类型:

1. 使用数字或变量作为下标

cat shuzu.txt

a

b

c

d

awk '{name[a++]=$1};END{for(i in name){printi,name[i]}}' shuzu.txt

0 a

1 b

2 c

3 d

注意下标是从0开始的,这个输出的顺序不一定每次都一样,是随机的,如果要想让输出按照数组下标的顺序输出,就要用for循环了,而不用遍历了:awk'{name[a++]=$1};END{for(i=0;i<NR;i++){print i,name[i]}}' shuzu.txt,或者使用sort去排序

 

awk '{name[1]=$1};END{for(i in name){printi,name[i]}}' shuzu.txt
为什么结果是1 d? 读一行处理一下,会覆盖之前赋予的值,最后一个是d

 

# awk'{name[$1]++};END{for(i in name){print i,name[i]}}' shuzu.txt
a 1
b 1
c 1
d 1
e 1
f 1
定义数组名、取值作为下标、并赋值++,加完后为1,若有相同的,会叠加

 

统计apache的访问次数,访问ip:

awk '{IP[$1]++};END{for (i in IP){print i,IP[i]}}' /var/log/httpd/access_log或/etc/httpd/logs/access_log

定义数组名、取值作为下标、并赋值++,加完后为1,若有相同的,会叠加

把相同ip的累加到一起,这就是下标++统计的作用

好巧妙呀

统计的公式

统计的万能公式排序:awk'{IP[$1]++}END{for (i in IP){print i,IP[i]}}' /var/log/httpd/access_log | sort-n -t " " -k2

 

统计的万能公式总结:简直就是叼爆了

1. awk '{print $1}'/var/log/httpd/access_log查看第一列的信息(这个第一步是有必要去做的,因为/etc/passwd里面需要-F “:”)

2.awk统计累加肯定要起一个数组名,取值$1给下标,赋值用++

awk '{ipaddr[$1]++;}' /var/log/httpd/access_log

3.输出语句在END里面写,并且必须要用for(i in 数组名)循环遍历

awk '{ipaddr[$1]++;}END{for(i in ipaddr){printipaddr[i]}}' /var/log/httpd/access_log

4.把ip也打印出来

awk '{ipaddr[$1]++;}END{for(i in ipaddr){print i,ipaddr[i]}}'/var/log/httpd/access_log

5排序

awk '{IP[$1]++}END{for (i in IP){print i,IP[i]}}' /var/log/httpd/access_log| sort -n -t " " -k2

 

统计系统中每种shell的用户有几个人?

awk -F ":" '{shellusr[$7]++}END{for(i inshellusr){print i,shellusr[i]}}' /etc/passwd

查看第一列的信息(这个第一步是有必要去做的,因为/etc/passwd里面需要-F ":")

 

打印uid、gid之和

awk -F":" '{print $1,"uid+gid="$3+$4}' /etc/passwd

 

1.对文件编辑
格式要求
姓名 工号 银行卡号 基本工资 绩效 总工资 保险 实发工资

解:
awk 'BEGIN{printf "%-s\t %-s\t %-s\t %-s\t %-s\t %-s\t %-s\t %-s\t %-s\t%-s\t %-s\t %-s\t %-s\t %-s\t %-s\t %-s\t\n","姓名","工号","银行卡号","基本工资","绩效","总工资","保险","实发工资","\na","007","123456\t","1000\t","100","1100","200","900"}'


2.打印uid小于20的用户的信息
格式要求
用户名 uid gid 家目录

awk -F ":" '$3<20{print $1,$3,$4,$6}'/etc/passwd

注意不能给20打双引号,因为是整型


3.打印用户的shell为可登陆的shell的用户名及shell
awk -F ":" '/bash$/{print $1,$7}' /etc/passwd

4.分别用shell和awk实现打印九九乘法表

for((i=1;i<=9;i++));do

    for((j=1;j<=i;j++));do

        echo -ne "${j}*${i}=$[j*i]\t"

    done

    echo

done


awk 'BEGIN{for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf"%d*%d=%d\t",j,i,i*j}print ""}}'

5. 这个班的每门课程的平均成绩(每科的平均成绩)
# cat e.txt
jim 80 60 89 80
tom 89 75 80 85
jack 78 96 90 98

解:
awk 'BEGIN{print "yuwen shuxue yingyutiyu";av_yuwen=0;av_shuxue=0;av_yingyu=0;av_tiyu=0}{av_yuwen+=$2;av_shuxue+=$3;av_yingyu+=$4;av_tiyu+=$5}END{printav_yuwen/NR,av_shuxue/NR,av_yingyu/NR,av_tiyu/NR}' e.txt

老师另一种方法:

awk ‘{}’ e.txt


6.统计每个人的平均成绩

awk 'BEGIN{print"name YW SX YW TY"}{sum=$2+$3+$4+$5;print $1,$2,$3,$4,$5,sum/=4}'e.txt


打印效果如下:
成绩在90分以上的有几人
成绩在80分到90分之间有几人
成绩在80分以下的有几人

解:

awk 'BEGIN{dj1=0;dj2=0;dj3=0}{av_score=($2+$3+$4+$5)/(NF-1);print$0,av_score;if(av_score>90){dj1=dj1+1}elseif(av_score<90&&av_score>80){dj2=dj2+1}else{dj3=dj3+1};}END{print"成绩在90分以上的有"dj1"人\n""成绩在80分到90分之间有"dj2"人\n""成绩在80分以下的有"dj3"人"}' e.txt


7.将passwd文件中第一行的每个字段纵向打印
awk -F ":" 'BEGIN{OFS="\n"}NR==1{print$1,$2,$3,$4,$5,$6,$7}' /etc/passwd

注意OFS对$0无效,要将$0分成$1,$2,$3,$4...

注意要NR==1


8.sed和awk的主要异同

sed: 流编辑,对文件内容编辑,动作的部分可以不写大括号,可以用到正则表达式和替换操作,没有内置变量和流程控制,加-i之后可以直接对源文件进行修改和备份。

awk: 文本报告生成器,对文本内容排版,动作的部分必须写大括号,可以用到正则表达式但不能使用替换操作,有内置变量和流程控制,不能对源文件进行修改和备份

相同点:都是读一行、处理一行,语法类似

 

文本处理工具有什么?

答:grep文本过滤、sed流编辑、awk文本报告生成器

 

VNC server是服务器端,开始菜单里面有,more-password设置为none;users第1、2个勾是控制的权利

 

正式考试:

1.将本机中/usr/local/src/目录下的http目录拷贝到192.168.1.30,要求不需要输入密码就可以传输

scp -r /usr/local/src/httproot:1@192.168.1.30/root

 

2.将本机上的大小为500M的/dev/sdc1分区,共享的192.168.1.0/24网段的所有用户,以读写的方式共享?如空间不够能够在线将空间提升至1000M,如何实现?

umount/dev/sdc1

parted/dev/sdc

mklabel gpt

mkpartprimary 1 500M

mkpartprimary 500M 1500M

pvcreate/dev/sdc1

vgcreate test/dev/sdc1

lvcreate -ndata -L 500M test

创建逻辑卷别忘了格式化啊:mkfs.xfs/dev/test/data

chmodg+w,o+w /dev/test/data

vim/etc/samba/smb.conf

[hello]

comment=thisis share-test dir

path=/dev/test/data

read only=No

hostsallow=192.168.1. 255.255.255.0

systemctlrestart nmb

systemctlrestart smb

空间不够就扩容:

pvcreate/dev/sdc2

vgextendtest /dev/sdc2

lvextend -L+500M /dev/test/data

xfs_growfs/dev/test/data

 

3. umask为034的情况下创建一个普通文件和目录,权限分别为多少?

解:

创建目录:777-034=743,得权限是drwxr---wx

创建文件:

666展开得到:rw-  rw- rw-

034展开得到:---  -wx r--

两者相减得到:rw-  r-- -w-

得权限是-rw-r---w-

用数字表示为642

 

4. 创建一个用户natasha,UID为2048,基本组为natasha,附加组为IT,家目录为/natasha,此用户登录后提示"欢迎natasha登录!"

groupadd IT

useraddnatasha

usermod -u2048 -g "natasha" -a -G "IT" -d /natasha natasha

订正:

不要漏了题目,忘记了后面还要登陆有欢迎

先切换到natasha用户,再[natasha@server ~]$ vim~/.bashrc修改初始化的文件,echo “欢迎natasha登录!”

 

5. 一个权限为700的脚本文件/tmp/test.sh,属主属组都为root,在不改变属主属组及基本UGO权限的情况下想让natasha用户可以执行,如何操作?

setfacl -mu:natasha:rx /tmp/test.sh

su - natasha

/tmp/test.sh

 

6. 如何查看系统的CPU,硬盘,内存信息?

查看CPU:cat /proc/cpuinfo或lscpu

查看硬盘:fdisk -l /dev/sda或df -hT

内存信息:cat /proc/meminfo或free -h

 

7. 将/etc目录下所有以.conf结尾的文件拷贝到/tmp/confiles目录中

\cp -R/etc/*.conf /tmp/confiles

备注:\cp是覆盖重名的并拷贝过去

 

8. 制定计划任务,每周一凌晨3:00将/var/log/下所有的文件压缩备份到/backup目录下,注意不要覆盖之前备份的内容

crontab -e

0 3 * * 1tar -czvf /backup/LogFiles$(date +\%F).gz /var/log/*

%最好转义一下,虽然在sh脚本里面不用转义,但是在crontab里面要转义\%

 

9. "b文件为a文件的软链接,通过b文件访问的也是a文件,由此可以得出结论:a文件和b文件为同一文件."这句话对吗?为什么?

b----->a

不对,a文件是软链接的源文件,如若a坏了,b也就坏了;但如若b坏了的话,a不会坏,a还能狗继续使用;

b文件的权限是777,而a权限的默认权限是肯定不是777,他们两者的权限不一样;

可以这么说:b文件只是a文件的一个快捷方式,你拷贝b文件过去,得不到a里面原有的内容,但你拷贝a文件过去,你能得到a里面原有的内容。

 

10. 怎样查看一个进程的进程号,请至少写出三种方法

pidof 进程名

pgrep -l 进程名的关键字
ps -ef
ps aux
pstree -p

11. raid0,raid1,raid5,raid10的优缺点?

raid 0:优点是平均分配每个磁盘的大小,大小都要一致,最少要用两个磁盘,读取性能是最快的,缺点是一个磁盘都不能坏,安全性低

raid 1:优点是磁盘大小全是一样大,并且最少要用两个磁盘,两两为一组,且内容是复制的,坏掉一个也不要紧,安全性最高,缺点是读取性能慢

raid 5:最少要3个磁盘为一组,有校验码,还可以有备盘,若坏了一个,则可以根据校验码计算出坏掉的那个磁盘的大小,并可以用备盘替补坏掉的磁盘,读写性能较快,安全性较高,缺点是校验码需要占用一个盘的大小

raid 10:优点是至少需要4个磁盘为一组,读写性能较快,安全性较高,每组各允许坏一个磁盘,缺点是坏了的话不能替补坏掉的那个磁盘

 

12. 在没有对vsftpd服务器作特殊设置的情况下,服务器端主动模式和被动模式的端口分别为多少?

答:服务端主动为20数据端口,21连接端口;

服务端被动数据为大于1024端口、21连接端口

 

13. httpd服务器中,仅允许192.168.10.0/24这个网段访问网页,如何设置?

vim/etc/httpd/conf/httpd.conf进入主配置文件设置httpd访问控制

<Directory"/var/www/html">

    order deny,allow

    deny from all

    allow from 192.168.10. 255.255.255.0

</Directory>保存退出

systemctlrestart httpd重启服务

 

14. 只显示apache主配置文件中的有效配置(不显示注释内容和空行),尽可能使用多种方法实现

1. grep -v"#" /etc/httpd/conf/httpd.conf | tr -s "\n"

2. grep -v"#\|^$" /etc/httpd/conf/httpd.conf

3. cat/etc/httpd/conf/httpd.conf | tr -s "\n" | grep -v "#"

4. sed ''/etc/httpd/conf/httpd.conf | grep -v "#" | tr -s "\n"

5. sed'/#/d;/^$/d' /etc/httpd/conf/httpd.conf

6. awk '{print $0}'/etc/httpd/conf/httpd.conf | grep -v "#" | tr -s "\n"

7. awk '!/#|^$/{print $0}' /etc/httpd/conf/httpd.conf

8.vimapache.sh

grep -v"#\|^$" /etc/httpd/conf/httpd.conf保存退出

bashapache.sh

9. vimapache.sh

grep -v"#\|^$" /etc/httpd/conf/httpd.conf保存退出

awk'BEGIN{system("bash apache.sh")}'

10.vim apache.txt

/#/d;/^$/d保存退出

sed -f apache.txt/etc/httpd/conf/httpd.conf

 

15. 统计apache访问日志中访问次数最多的前5名及访问次数.

1.cut -d" " -f1 /etc/httpd/logs/access_log | grep -v "::" | sort |uniq -c | tr -s " " | sort -nr | head -5

2. awk '{IP[$1]++}END{for (i in IP){print i,IP[i]}}' /var/log/httpd/access_log| grep -v "::" | sort -nr -t " " -k2 | head -5

 

附加

    写一个脚本httpd,执行时后接start参数启动httpd服务,接stop则停止,接restart则重启

    要求:

    1.启动失败提示原因: 1)端口被占用  2)服务已在运行  3)配置文件语法错误

    2.停止服务前先检查配置文件语法,若有错误则禁止停止服务

    3.停止失败提示原因: 1)服务未运行  2)配置文件语法错误

    提示: 1)重启=停止+启动  2)可用httpd命令启动服务   3)可用httpd -t检测语法

解:

if(($1=="start"));then

    duankou=`netstat -luantp | grep "80" | tr -s " " | cut -d " " -f6`

    run=`systemctl status httpd | grep"Active" | tr -s " " | cut -d " " -f4`

    if(($duankou=="LISTEN"));then

        echo "端口被占用"

    elif(($run=="(running)"));then

        echo "服务已在运行"

    else

        systemctl start httpd

    fi

fi

if(($1=="restart"));then

    systemctl restart httpd

elif(($1=="stop"));then

    systemctl stop httpd

fi

订正:

if [ $1 =="start" ];then

    duankou=`netstat -luantp | grep "80" | tr -s " " | cut -d " " -f6`

    run=`systemctl status httpd | grep"Active" | tr -s " " | cut -d " " -f4`

    if [ $duankou == "LISTEN" ];then

        echo "端口被占用"

    elif [ -z $duankou ];then

        if [ $run == "(running)"];then

            echo "服务已在运行"

        elif [ $run == "(dead)"];then

            systemctl start httpd

        fi

    fi

fi

if ["$1" == "restart" ];then

    systemctl restart httpd

elif ["$1" == "stop" ];then

    systemctl stop httpd

fi

总结:会写的题却没有时间写,原因:没有开启超速度!没时间写和执行了!

 

马哥:

lsblk是查看磁盘分区的大小情况

blkid /dev/sda1可以查看uuid和磁盘类型是xfs还是vfat或其他的

 

凡哥作业6:

1、创建计划任务,5分钟后给所有人发消息"hello"。

方法一:(非交互式)

echo 'wall   hello' | at  now  +5min

 

方法二:(交互式)

at  now +5min

wall  hello

ctrl+d

 

方法三:(非交互式)

at  now +5min <<EOF

wall  hello

EOF

 

2、今天晚上9:50执行关机命令。用at命令的两种方法(交互式、非交互式)。

交互式:

at  9:50pm

poweroff

ctrl+d

 

非交互式:

echo 'poweroff' | at  21:50

 

3、每天晚上11:50打包备份/etc目录到/opt/年-月-日_etc.tar.gz文件。

方法一:

crontab   -e

50  23  * *   *    tar  -czf   /opt/$(date  +\%F)_etc.tar.gz   /etc

%最好转义一下,虽然在sh脚本里面不用转义,但是在crontab里面要转义\%

 

方法二:

vim  /opt/c1.sh

tar  -czf   /opt/$(date  +\%F)_etc.tar.gz   /etc

          

chmod +x  /opt/c1.sh

crontab  -e

50  23  * *   *    . /opt/c1.sh

 

4、每周1、3 、5的8、12、15、18点每隔5分钟发送‘ni  hao’消息给所有用户。

方法一:

crontab  -e

*/5  8,12,15,18   *  * 1,3,5    wall    'ni hao'

 

方法二:

echo "*/5  8,12,15,18   *  * 1,3,5  root   wall   'ni hao'">> /etc/crontab

 

6、创建日志文件/var/log/test.log,将ls   /命令的结果追加到test.log文件中,给test.log创建轮滚策略。每天一轮滚,用数字作为文件名后缀,启用压缩功能,保留5个备份。强制做轮滚测试。

touch /var/log/test.log

ls  /  >> /var/log/test.log

cat  >/etc/logrotate.d/test <<ok

/var/log/test.log {

daily

nodateext

create

compress

rotate  5

}

ok

测试:logrotate-fv /etc/logrotate.d/test
原创粉丝点击