马哥教育网络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

相关推荐

  • RPM软件包管理器及前端工具yum

    目前在linux系统之上软件安装方式最常见的有两种,分别是: dpkg:这个机制最早是由Debian Linux社区所开发出来的,透过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时还能提供安装后的软件资讯,实在非常不错。只要是衍生于Debian的其他linux发行版,大多使用dpkg这个机制来管理软件的,包括B2D、Ubuntu等等。 RP…

    Linux干货 2016-08-20
  • httpd功能配置之访问控制

       httpd服务可以实现对资源访问控制,可以根据IP地址和用户两种方式进行控制。    一、用户认证控制      1、在站点根目录下创建一个目录及一个页面文件      2、修改/var/httpd/conf/httpd.conf文件   &n…

    Linux干货 2016-03-11
  • linux学习第二天知识点-linux入门及使用帮助

    一 基础命令 1. #ifconfig     显示或配置网卡的命令,英文全称是network interfaces configuring。     配置网卡的IP地址语法例:ifconfig eth0 192.168.0.1 netmask 255.255.255.0 2.&…

    Linux干货 2016-07-26
  • 文件的从属权限和特殊权限

    基础权限   rwx     经过今天的洗礼,了解了文件的权限位(rwx),而权限对于目录和文件有着不同的意义     使用ls -l 命令后可以看到     -rw-r–r–. 1 root root 1…

    Linux干货 2016-08-04
  • 文本处理工具-2

    1、 sed 是一种行/流编辑器,它一次处理一行内容;处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中该行内容,处理完成后,把缓冲区的该行内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出,Sed 可以用来自动编辑一个或多个文件。 2…

    Linux干货 2016-08-15
  • 超文本传输协议-HTTP

        超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。     设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或…

    Linux干货 2017-07-31

评论列表(1条)

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

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