马哥教育网络班21期+第15周课程练习

1、总结sed和awk的详细用法;

sed 流编辑器,处理一行数据到模式空间(p),不匹配条件话就输出源行,匹配条件且有处理话,就输出处理过后的行和源行,
匹配条件且没有处理动作的话,只输出p空间的行;保持空间(h)用来存放模式空间的临时处理结果
[root@centos ~]# sed '' sed.txt 
1111   匹配条件没有处理动作,直接打印p空间读到的行
2222
3333
4444
[root@centos ~]# sed  'p' sed.txt 
1111   匹配条件且有处理话,就输出处理过后的行和源行
1111   
2222  
2222
3333
3333
4444
4444
[root@centos ~]# sed   -n 'p' sed.txt 
1111  -n 匹配条件和处理后的行
2222
3333
4444
[root@centos ~]# sed   '2p' sed.txt 
1111   1,3,4行为不匹配条件,输出源行
2222   
2222   匹配条件且有处理话,就输出处理过后的行和源行
3333   
4444
[root@centos ~]# sed  '2G' sed.txt 
1111    1,3,4行为不匹配条件,输出源行
2222   
----    匹配条件且没有处理动作的话,只输出p的行(p的第二行变成了2222和h的空行)
3333
4444    G:从保持空间取出内容追加至模式空间
[root@centos ~]# sed  '2g' sed.txt 
1111    1,3,4行为不匹配条件,输出源行
----    匹配条件且没有处理动作的话,只输出p的行(p的第二行2222被保持空间的空行覆盖)
3333    g: 从保持空间取出数据覆盖至模式空间;
4444
[root@centos ~]# sed '2h' sed.txt 
1111     1,3,4行为不匹配条件,输出源行
2222     匹配条件且没有处理动作的话,只输出p的行(p的第二行2222覆盖了h的空行,此时h的行为2222)
3333     h: 把模式空间中的内容覆盖至保持空间中;
4444
[root@centos ~]# sed '2H' sed.txt 
1111     1,3,4行为不匹配条件,输出源行
2222     匹配条件且没有处理动作的话,只输出p的行(p的第二行2222追加到了h的空行,此时h的行为空行和2222)
3333     H:把模式空间中的内容追加至保持空间中
4444
[root@centos ~]# sed '2x' sed.txt 
1111     1,3,4行为不匹配条件,输出源行
----        匹配条件且没有处理动作的话,只输出p的行(p的第二行2222变成了h的空行,此时h的行为2222)
3333     x: 把模式空间中的内容与保持空间中的内容进行互换;
4444
[root@centos ~]# sed 'n;p' sed.txt 
1111    第一行执行n,匹配条件且没有处理动作的话,只输出p空间的行 1111和2222(本来只有1111)
2222    
2222    第一行的p命令打印刚读取的下一行2222, 如此循环,下一次该从3333起
3333
4444
4444    n: 读取匹配到的行的下一行至模式空间,相当于每次处理两行数据;
[root@centos ~]# sed  'N;p' sed.txt 
1111     第一行执行N,匹配条件且没有处理动作的话,只输出p空间的行 1111和2222
2222
1111     第一行的p命令,则打印了p空间的行1111和2222 如此循环,下一次从3333起
2222
3333
4444
3333
4444   N:追加匹配到的行的下一行至模式空间,相当于每次处理两行数据;
[root@centos ~]# sed '$!N;$!D' sed.txt 
3333    
4444
匹配条件且没有处理动作的话,只输出p空间的行,首先1111,2222不是最后一行,则$!D从p空间删掉1111和2222,
然后3333,4444中的4444是最后一行,$!D没有起作用,最后p空间的3333,4444输出到屏幕
以上是自己个人理解,不保证正确,,,更多用法请man sed
awk
awk [options] 'program' FILE ...
options:-F:指明输入时用到的字段分隔符;-v var=value: 自定义变量;
program: PATTERN{ACTION STATEMENTS} 此处大括号一定不能省去,要和statement的大括号区分开
输出:print $0(全部), $1,$2, ...$NF
格式化输出:printf FORMAT, item1, item2, ...几个item就几个格式化符号,%d,%f,%s,-左对齐
内建变量:FS,OFS,RS,ORS,NF,NR,FNR,FILENAME,ARGC,ARGV
操作符:运算+-*/%^ 赋值,= += ,,++ -- 模式匹配 !~ ~ 逻辑 && || !
if-else: if(condition) statement else statement
多if-else:if(condition) statement elif(condition) statement ,,else statement
while循环:while (condition) statement;控制器(i++,i--)
do-while 循环: do statement while(condition) 
for循环:for(variable assignment;condition;iteration process) {for-body}
switch语句:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement;..;default: statement}
控制语句关键字:break,continue,next
内嵌函数:rand(),lenght(),sub,gsub,split(),,,,
数组: 
[root@centos ~]# awk 'BEGIN{wkd[0]="Monday";wkd[1]="Tuseday";wkd[2]="Wednesday";for (i in wkd) {print wkd[i]}}'
Monday
Tuseday
Wednesday
[root@centos ~]# awk 'BEGIN{wkd["Mon"]="Monday";wkd["Tue"]="Tuseday";wkd["Wed"]="Wednesday";for (i in wkd) {print wkd[i]}}'
Wednesday
Tuseday
Monday
更多awk请参考awk书籍,或man awk

2、删除/boot/grub/grub.conf文件中所有行的行首的空白字符;

[root@centos ~]# sed 's@^[[:space:]]@@g' /boot/grub/grub.conf

3、删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符;

[root@centos ~]# sed 's@^[#][[:space:]]\+@@g' /etc/fstab

4、把/etc/fstab文件的奇数行另存为/tmp/fstab.3;

[root@centos ~]# cat -n  /etc/fstab | sed  -n  '1~2 !p' 
     2#
     4# Created by anaconda on Thu Jun  2 18:06:52 2016
     6# Accessible filesystems, by reference, are maintained under '/dev/disk'
     8#
    10UUID=19bb5e83-9587-4a9a-b2e9-e4a26fdb9e29 /boot   ext4    defaults        1 2
    12tmpfs                   /dev/shm                tmpfs   defaults        0 0
    14sysfs                   /sys                    sysfs   defaults        0 0
[root@centos ~]# sed  -n  '1~2 !p' /etc/fstab 
#
# Created by anaconda on Thu Jun  2 18:06:52 2016
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
UUID=19bb5e83-9587-4a9a-b2e9-e4a26fdb9e29 /boot                   ext4    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
sysfs                   /sys                    sysfs   defaults        0 0
[root@centos ~]# sed  -n  '1~2 !p' /etc/fstab >/tmp/fstab.3

5、echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名;

[root@centos ~]# echo "/etc/sysconfig/atd" | sed  's@[^/]\+/\?$@@'
/etc/sysconfig/
[root@centos ~]# echo "/var/log/messages" | sed -r 's@(/.*/)@@g'
messages

6、统计指定文件中所有行中每个单词出现的次数;

[root@centos ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' sed.txt 
4444 1
1111 1
2222 1
3333 1

7、统计当前系统上所有tcp连接的各种状态的个数;

[root@centos ~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'
ESTABLISHED 2
LISTEN 10

8、统计指定的web访问日志中各ip的资源访问次数:

[root@centos ~]#  awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
192.168.40.128 2
127.0.0.1 2

9、写一个脚本:定义一个数组,数组元素为/var/log目录下所有以.log结尾的文件的名字;显示每个文件的行数;

[root@centos test]# cat exercise1.sh 
#!/bin/bash
declare -a dir
dir=$(ls /var/log/*.log)
for i in $(seq 0 $[${#dir[*]}-1]);do
wc -l ${dir[$i]}
done

10、写一个脚本,能从所有同学中随机挑选一个同学回答问题;进一步地:可接受一个参数,做为要挑选的同学的个数;

[root@centos test]# ./exercise2.sh 
Now ,We have 99 students that you can pick up!
How many students do you want:hehe
Must be a number!
[root@centos test]# ./exercise2.sh 
Now ,We have 99 students that you can pick up!
How many students do you want:2
stu97, You answer my questions Please!
stu51, You answer my questions Please!
[root@centos test]# ./exercise2.sh 
Now ,We have 99 students that you can pick up!
How many students do you want:1
stu67, You answer my questions Please!
[root@centos test]# cat exercise2.sh 
#!/bin/bash
declare -a stu
for i in $(seq 1 99);do
   k=$[ $i - 1 ]
 stu[ $k ]=stu$i
done
echo "Now ,We have $i students that you can pick up!"
read -p "How many students do you want:" count
 ! let count++ &>/dev/null   &&  echo "Must be a number!" && exit 13
 [ $count -eq 0 -o  $count -gt 99 ] &&  echo "Please selcet a number between 1 and 99!"
  && exit 12
m=1
while [ $m -lt $count ];do
    rand=${RANDOM:0-2}
if echo  $rand  | grep "^0" &>/dev/null;then
    index=${rand:0-1}
echo "${stu[ $index ]}, You answer my questions Please!"
else
echo "${stu[ $rand ]}, You answer my questions Please!"
fi
let m++
done

11、授权centos用户可以运行fdisk命令完成磁盘管理,以及使用mkfs或mke2fs实现文件系统管理;

[root@centos ~]# vim /etc/sudoers
centos  192.168.40.128=/sbin/mkfs, /sbin/mke2fs, /sbin/ifconfig
[root@centos ~]# su centos
[centos@centos root]$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:0C:29:E7:51:E1  
[centos@centos root]$ shutdown -h now
shutdown: Need to be root

12、授权gentoo用户可以运行逻辑卷管理的相关命令;

[root@centos ~]# vim /etc/sudoers
gentoo  192.168.40.128=/sbin/*create, /sbin/*reduce,/sbin/*scan, /sbin/*display, /sbin/fsck,
/sbin/resize2fs 可以考虑使用别名形式

13、基于pam_time.so模块,限制用户通过sshd服务远程登录只能在工作时间进行;

[root@centos ~]# grep -i "usepam" /etc/ssh/sshd_config 
#UsePAM no
UsePAM yes  确保sshd开启Pam模块认证
[root@centos ~]# ls /lib64/security/pam_time.so 保证pam_time.so 存在 
[root@centos ~]# ls /etc/pam.d/sshd /etc/security/time.conf 保证Pam模块配置文件存在
/etc/pam.d/sshd 添加 session    required     pam_time.so    
/etc/security/time.conf 添加 sshd;ttyp*;root;!ALSa0000-2400 工作日时写成 !ALWd0000-2400
Connecting to 192.168.40.128:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Sun Jun  5 03:56:43 2016 from 192.168.40.1
Connection closed by foreign host.
Disconnected from remote host(192.168.40.) at 08:32:07.

14、基于pam_listfile.so模块,定义仅某些用户,或某些组内的用户可登录系统;

此题按linux_pam_SAG文档的 pam_listfile.so 在/etc/pam.d/login 的使用禁止用户登录系统,
会出现了所有普通用户都无法登录,自己没有确定原因,下面是禁止用户通过ssh登录系统
[root@centos ~]# grep "pam_listfile" /etc/pam.d/sshd 
auth required pam_listfile.so item=user sense=deny file=/etc/nossh onerr=fail
[root@centos ~]# cat /etc/nossh
derulo

原创文章,作者:Snoo,如若转载,请注明出处:http://www.178linux.com/40349

(0)
SnooSnoo
上一篇 2016-08-30 15:48
下一篇 2016-08-30

相关推荐

  • 第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@UncleZ ~]# who | cut -d' ' -f1 | uniq -c 2、取出最后登录到当前系统的用户的相关信息。 [roo…

    Linux干货 2016-12-17
  • 第一周学习内容

    1、LINUX的三大主流版本:debian slackware redhat 2、一个完整的操作系统是由内核+运行在内核之上的应用程序组成。      LINUX操作系统是由linux内核+GNU开源组织编写的应用程序组成(GNU/Linux) 3、CPU架构:X86(X64)、摩托罗拉的m68k、arm、IBM的POWER(性…

    Linux干货 2016-12-03
  • linux学习笔记: shell脚本编程相关(上)

    前言 unix/linux操作系统下的shell,是一种壳,其目的是提供一个用户与计算机相互交互的命令接口,通过输入各种命令,达到操作的目的。 与此同时,shell支持控制流程,进而可以组合出各种各样的应用实例。 shell脚本的格式  首行shebang机制:  bash脚本,首行添加#!/bin/bash&nbsp…

    Linux干货 2017-04-18
  • CentOS系统启动流程与grub

    本文主要讲述CenOS系统启动的整个流程。 对于CentOS系统来说,整个启动过程可分为4个阶段,分别是:加点自检,加载MBR,加载内核并执行初始化信息,初始化用户空间。下面就具体来描述每个过程都做了什么。 一.加点自检(power on system test,POST) 任何一种操作系统的启动,第一步必定是加点自检,主要功能是装载在硬件芯片CMOS之上的…

    Linux干货 2016-11-29
  • 计算机网络基础及常用工具

    Linux网络属性配置      计算机网络:      TCP/IP: 协议栈(使用)      ISO, OSI: 协议栈(学习)  MAC:Media Access Control      48bits:   &…

    Linux干货 2017-01-02
  • 用户和组相关的配置文件总结

    前言: 在用户管理,组管理过程中,最基本的四个文件就是/etc下面的passwd,shadow,group,gshadow。他们记录了与用户和组相关的信息。是学习和深入了解用户,组的基本。 除了这些基本的配置文件 还有与初始化相关的配置文件。定义用户添加时初始状态的配置文件/etc/default/useradd。 以及用户家目录的内容文件参考目录/etc/…

    Linux干货 2016-10-24

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-07 17:33

    非常的棒,总结的非常的好,一题多解的方法,值得表扬。