马哥教育网络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
下一篇 2016-08-22

相关推荐

  • linux磁盘管理及其磁盘分区工具的使用

    一、 几种分区工具: 1.图形化工具gnome-disks使用简单,在此不在赘述。 2.fdisk使用: fdisk支持MBR,也支持GPT分区,对于一块硬盘最多只能理解15个分区,一般使用fdisk做MBR分区,gdisk做GPT分区。下面为fdisk分区示例: [root@centos7 ~]# fdisk /dev/sde…

    Linux干货 2016-08-29
  • 第十四周 N21 总有刁民想害朕

    系统的INPUT和OUTPUT默认策略为DROP; 1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;  iptables -A  INPUT -p tcp –dpor…

    Linux干货 2016-10-17
  • 图文演示Netmeeting的三大功能

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jeffyyko.blog.51cto.com/28563/153578     可能很多朋友对Netmeeting有一定认识,但我想真正用过的朋友应该不多,因为类似的软件太多太多了,所以Netmeet…

    Linux干货 2015-03-25
  • linux程序包管理rpm,yum和编译安装以及冒泡排序练习

    linux程序包管理: API:Application Programming Interface POSIX:Portable OS 程序源代码–> 预处理–> 编译–> 汇编–> 链接 静态编译: 共享编译:.so ABI:Application Binary Interface W…

    Linux干货 2016-08-24
  • centos6安装docker

    使用的操作系统是是centos6.3,按照官方的推荐的配置,把linux内核升级到3.8以上。安装步骤如下: 1、升级内核版本(包含aufs) cd /etc/yum.repos.d     wget http://www.hop5.in/yum/el6/hop5.repo   …

    Linux干货 2016-05-05
  • iptables 从入门到进阶

    Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(或网络层防火墙)。在Linux中netfilter和iptables都是指Linux防火墙。区别在于: netfilter:指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”的防火墙功能体系。 iptables:指的是…

    Linux干货 2017-01-10

评论列表(1条)

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

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