马哥教育网络19期+第十五周课程练习

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

  a).sed命令

sed可以实现grep的大部分功能,而且还可以查找替换
[root@localhost ~]# sed '10'p -n 1.txt
[root@localhost ~]# sed '1,4'p -n 1.txt
[root@localhost ~]# sed '5,$'p -n 1.txt
说明:这里的p是print的意思,加上-n后就可以只打印符合规则的行,如果不加则会把1.txt从头到尾打印一遍。
    '10'p 打印第 10 行
    '1,4'p 打印 1 到 4 行
    '5,$'p 打印 5 到末行
    
打印包 含某个字符串的行
[root@localhost ~]# sed -n '/root/'p 1.txt

可以使用 ^ . * $ 等特殊符号
[root@localhost ~]# sed -n '/ro.t/'p 1.txt
[root@localhost ~]# sed -n '/^roo/'p 1.txt

[root@localhost ~]# sed -n -r '/ro+/'p 1.txt
[root@localhost ~]# sed -n '/ro\+/'p 1.txt
上面两个命令的效果是一样的。

“-e”可以实现同时进行多个任务、也可以用“;”实现
[root@localhost ~]# sed -e '/root/p' -e '/body/p' -n 1.txt
[root@localhost ~]# sed '/root/p; /body/p' -n 1.txt

删除指定行
[root@localhost ~]# sed '/root/d' 1.txt; sed '1d' 1.txt; sed '1,10d' 1.txt
说明:'/root/d' 删除包含 root 的行;'1d'或者'1'd 删除第一行;'1,10'd 删除 1 到 10 行
替换功能

[root@localhost ~]# sed '1,2s/ot/to/g' 1.txt
说明:s就是替换的意思,g为全局替换,否则只替换第一次的,/也可以为# @等

[root@localhost ~]# sed '1,2s@ot@to@g' 1.txt
删除所有数字

[root@localhost ~]# sed 's/[0-9]//g' 1.txt
说明: 其实就是把所有数字替换为空字符

删除所有非数字
[root@localhost ~]# sed 's/[^0-9]//g' 1.txt

调换两个字符串位置
[root@localhost ~]# head -n2 1.txt |sed -r 's/(root)(.*)(bash)/\3\2\1/'
说明:在 sed 中可以用()去表示一个整体,本例中把 root 和 bash 调换位置,后面的\1\2\3 分别表示第一个小括号里面的,第二个小括号里面的以及第三个小括号里面的内容。

-i 选项可 以直接修改文件内容
[root@localhost ~]# sed -i 's/ot/to/g' 1.txt

  b).awk命令

截取文档中的某段
[root@localhost ~]# awk -F ':' '{print $1}' 1.txt
说明: -F 指定分隔符号为:
也可以使用自定义字符连接每个段
[root@localhost ~]# awk -F':' '{print $1"#"$2"#"$3"#"$4}' 1.txt
或者使用 awk 内部变量 OFS,格式如下:
# awk -F ':' '{OFS="#"} {print $1,$2,$3,$4}' 1.txt

匹配字符或字符串
[root@localhost ~]# awk '/oo/' 1.txt
针对某个段匹配
[root@localhost ~]# awk -F ':' '$1 ~/oo/' 1.txt
多次匹配
[root@localhost ~]# awk -F ':' '/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/' 1.txt
条件操作符==, >,<,!=,>=;<=
第三段为 0
[root@localhost ~]# awk -F ':' '$3=="0"' 1.txt;

第三段大于等于 500
[root@localhost ~]# awk -F ':' '$3>=500' 1.txt;
说明:当比较数字时,不能加双引号,如果写成$3>="500"就不符合我们的需求了。
第七段不是'/sbin/nologin'
[root@localhost ~]# awk -F ':' '$7!="/sbin/nologin"' 1.txt;
第三段小于第四段
[root@localhost ~]# awk -F ':' '$3<$4' 1.txt ;
第三段大于 5,并且第三段小于 7
[root@localhost ~]# awk -F ':' '$3>5 && $3<7' 1.txt
第三段大于 5 或者第七段为'/bin/bash'
[root@localhost ~]# awk -F ':' '$3>"5" || $7=="/bin/bash"' 1.txt

awk  内置变量 NF( 段数) NR( 行数)
[root@localhost ~]# head -n3 1.txt | awk -F ':' '{print NF}'
[root@localhost ~]# head -n3 1.txt | awk -F ':' '{print $NF}'
[root@localhost ~]# head -n3 1.txt | awk -F ':' '{print NR}'

打印 20 行以后的行
[root@localhost ~]# awk 'NR>20' 1.txt
打印 20 行以后并且第一段包含'ssh'的行
[root@localhost ~]# awk -F ':' 'NR>20 && $1 ~ /ssh/' 1.txt

更改某个段的值
[root@localhost ~]# awk -F ':' '$1="root"' 1.txt

数学计算, 把第三段和第四段值相加,并赋予第七段
[root@localhost ~]# awk -F ':' '{$7=$3+$4; print $0}' 1.txt
但是这样的话,相当于改变了原来文本的结构,所以 print $0 的时候就不再有分隔符显示。如果想显
示分隔符需要借助 OFS
[root@localhost ~]# awk -F ':' '{OFS=":"} {$7=$3+$4; print $0}' 1.txt
计算第三段的总和
[root@localhost ~]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt
awk 中也可以使用 if  关键词
[root@localhost ~]# awk -F ':' '{if ($1=="root") print $0}' 1.txt

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

sed 's@^[[:space:]]\+@@' /boot/grub/grub.conf

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

sed 's@^#[[:space:]]\+@@' /etc/fstab

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

sed 'n;d' /etc/fstab >> /tmp/fstab.3

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

echo "/etc/fstab" | sed 's@[^/]\+/\?$@@'

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

awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab

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

netstat -nat | awk 'FNR>2{print $NF}' | sort | uniq -c

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

# vim test.sh 
#!/bin/bash
#
cat access.log |sed -rn '/16\/Aug\/2015/p' > a.txt 
#统计test.txt里面有多少个ip访问
cat test.txt |awk '{print $1}'|sort |uniq > ipnum.txt
#通过shell统计每个ip访问次数
for i in `cat ipnum.txt`
do 
iptj=`cat  access.log |grep $i | grep -v 400 |wc -l`
echo "ip地址"$i"在2016-08-15日当天累计请求次数为"$iptj"次,平均每分钟请求次数为:"$(($iptj/1440)) >> result.txt
done

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

#!/bin/bash
#
Arraywc=(/var/log/*.log)
for i in $(seq 0 $[${#Arraywc[@]}-1])
  #do wc -l ${Arraywc[i]}
    do  wc -l ${Arraywc[i]} >> /tmp/log.wc 
done
awk '{printf "%-32s%s\n",$2,$1}' /tmp/log.wc
rm /tmp/log.wc

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

#!/bin/bash
student=(a b c d e f g h i j k)
i=$[$RANDOM % ${#student[@]}]
echo ${student[i]}

进一步地:

#!/bin/bash
#
students=(a b c d e f g h i j k)
read -t 5 -p "Please input the number of students: " num
if [[ $num -le ${#students[@]} ]]
then 
     for ((i=0;i<num;i++))
     do x=$[$RANDOM % ${#students[@]}]
        echo  ${students[$x]}
        students[$x]=${students[${#students[@]}-1]}
        unset students[${#students[@]}-1]     #这样删就不会再选到这个索引号
       #unset students[$x]  这个删除只删除了元素的值,但索引号仍在值为空
     done  
else echo "Error";exit
fi

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

centos  ALL=(root)   NOPASSWD: /sbin/fdisk, /sbin/mke2fs, /sbin/mkfs

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

gentoo  ALL=(root)   lvm

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

(1).# vim /etc/pam.d/sshd
在account required pam_nologin.so上插入一行:
account required pam_time.so
(2).编辑pam_time.so模块的配置文件
# vim /etc/security/time.conf
*;*;*;MoTuWeThFr0900-1800
上面表示工作时间的9点到下午6点允许访问ssh

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

创建一个用户的列表文件,例如/etc/sshd_userlist,然后编辑文件
root 
centos
gentoo
然后修改文件的权限和属主
# chmod 600 /etc/sshd_userlist 
# chown root /etc/sshd_userlist
再编辑/etc/pam.d/sshd文件,加入以下一行内容:
auth required pam_listfile.so item=user sense=allow file=/etc/sshd_userlist onerr=succeed

然后再次登录时,只允许文件中定义的root、centos和gentoo用户登录。

原创文章,作者:Net19_口香糖,如若转载,请注明出处:http://www.178linux.com/36381

(0)
Net19_口香糖Net19_口香糖
上一篇 2016-08-22 09:29
下一篇 2016-08-22 09:29

相关推荐

  • N24_huamao 学习计划

       每天会安排好时间按顺序看视频进行学习,由于基础比较差我会先进行笔记然后再做博客记录。需要操作的知识点会跟着视频和自己的理解去做,最后达到马哥所说的“技能”所需的要求。运维的知识点很广很多也很复杂。当然想学好后边的就要先打好基础从linux系统开始学习把重要的命令记牢应用灵活才可以。这第一步自己一定要迈好。

    Linux干货 2016-10-26
  • rsyslog同步history日志

    前言   由于公司业务是由公司内部开人员及外包团队共同开发,所以需要使用rsyslog对history日志做收集、审计。虽然搭建及配置非常简单,但是在日常运维工作中很实用,所以记录下,方便日后快速搭建。如果有错误,望大神指正。 syslog简介 syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/sysl…

    Linux干货 2015-04-03
  • Shell 编 程 之 until循 环 语 句-20160817

    Shell 编 程 之 until循 环 语 句 §·练习题: 1 每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统? 解:解题思路:按照题意该脚本一直无限循环,一直探测用户h…

    Linux干货 2016-08-22
  • DNS服务器搭建

    1. 配置正向解析 1.安装bind yum install bind bind-utils -y 2.配置/etc/named.conf,需要修改的地方 listen-on port 53 { 127.0.0.1; 192.168.42.135; }; allow-query { any; }; dnssec-enable no; dnssec-valid…

    Linux干货 2017-05-24
  • old notes

    yum update: update software guest edition ***: how to install guest edition: 1) need to root: su – 2) yum install kernel-devel 3)yum install gcc* ( when don't remember n…

    Linux干货 2016-09-19
  • 马哥教育网络班21期+第13周课程练习

    1、建立samba共享,共享目录为/data,要求:(描述完整的过程) 1)共享名为shared,工作组为magedu; 2)添加组develop,添加用户gentoo,centos和ubuntu,其中gentoo和centos以develop为附加组,ubuntu不属于develop组;密码均为用户名; 3)添加samba用户gentoo,centos和u…

    Linux干货 2016-10-24

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-22 15:12

    写的很好,排版也很棒,加油