第十五周作业

栏目: 服务器 · 发布时间: 7年前

内容简介:第十五周作业

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

sed:

模式空间:sed是一种在线编辑器、行编辑器,一次处理一行内容,在处理时,把当前处理的行存储在临时缓冲区当中,并在该缓冲区中完成后续的处理,该缓冲区被称为”模式空间”。

保持空间:在模式空间中处理完一行内容后会继续处理下一行,但是对于处理过的行可能还有其他的处理,因此可以先把处理过的行”传递”至保持空间中,然后在后续的处理中再次”传送”回模式空间中。

命令语法:sed

[OPTION]…{script}[input_file]…[actions]

常用参数 -r 支持扩展正则表达式
-n 静默模式
-e 指定多脚本运行
-f 从指定文件中读取脚本并运行
-i 直接修改源文件
地址定界 # #表示数字,指定行
$ 最后一行
/regexp/ 任何能够被regexp所匹配的行
#,/regexp/ 从#行,到第一次被regexp所匹配到的行结束,中间的所有行
#1,#2 从#1行到#2行中间所有行
/regexp1/,/regexp2/ 从第一次被regexp1匹配到的行开始,到第一次被regexp2匹配到的行结束,中间的所有行
#,+n 从第#行开始,一直到向下的n行
first~step 从first行开始,以步长为step,匹配到结束行
编辑命令 d 删除模式空间中的行
= 为模式空间中的行打印行号
a \text 在行后追加文本,支持使用\n实现多行追加
i \text 在行前插入文本,支持使用\n实现多行追加
c \text 用text替换匹配到的行
p 打印模式空间中的行
s/regexp/replacement/ 替换第一个由regexp匹配到的内容为replacement
s/regexp/replacement/g 替换所有由regexp匹配到的内容为replacement
s/regexp/replacement/i 替换所有由regexp匹配到的内容为replacement,并且忽略regexp的大小写
w /path/to/somefile 把指定的内容另存至/path/to/somefile路径所指定的文件中
r /path/from/somefile 在文件的指定位置插入另一个文件的所有内容,完成文件合并
高级命令 h 用模式空间中的内容覆盖保持空间的内容
H 把模式空间中的内容追加至保持空间中内容的后面
g 从保持空间中取到其内容,并将其覆盖模式空间中的内容
G 从保持空间中取到其内容,并将其追加在模式空间中的内容的后面
x 把保持空间和模式空间中的行进行交换
n 读取匹配到的行的下一行至模式空间(会覆盖模式空间中的原有内容)
N 读取匹配到的行的下一行至模式空间,追加在模式空间中原有内容的后面
d 删除模式空间中的内容
D 删除多行模式空间中的首行

awk:

命令语法:gawk [options] ‘program’ FILE …

program: PATTERN{ACTION STATEMENTS}

语句之间用分号分隔

print, printf

选项:

-F:指明输入时用到的字段分隔符;

-v var=value: 自定义变量;

1、print

print item1, item2, …

要点:

(1) 逗号分隔符;

(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;

(3) 如省略item,相当于print $0; 

2、变量

2.1 内建变量

FS:input field seperator,默认为空白字符;

OFS:output field seperator,默认为空白字符;

RS:input record seperator,输入时的换行符;

ORS:output record seperator,输出时的换行符;

NF:number of field,字段数量

{print NF}, {print $NF}

NR:number of record, 行数;

FNR:各文件分别计数;行数;

FILENAME:当前文件名;

ARGC:命令行参数的个数;

ARGV:数组,保存的是命令行所给定的各参数;

2.2 自定义变量

(1) -v var=value

变量名区分字符大小写;

(2) 在program中直接定义

3、printf命令

格式化输出:printf FORMAT, item1, item2, …

(1) FORMAT必须给出;

(2) 不会自动换行,需要显式给出换行控制符,\n

(3) FORMAT中需要分别为后面的每个item指定一个格式化符号;

格式符:

%c: 显示字符的ASCII码;

%d, %i: 显示十进制整数;

%e, %E: 科学计数法数值显示;

%f:显示为浮点数;

%g, %G:以科学计数法或浮点形式显示数值;

%s:显示字符串;

%u:无符号整数;

%%: 显示%自身;

修饰符:

#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;

%3.1f

-: 左对齐

+:显示数值的符号

4、操作符

算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y

-x

+x: 转换为数值;

字符串操作符:没有符号的操作符,字符串连接

赋值操作符:

=, +=, -=, *=, /=, %=, ^=

++, —

比较操作符:

>, >=, <, <=, !=, ==

模式匹配符:

~:是否匹配

!~:是否不匹配

逻辑操作符:

&&

||

!

函数调用:

function_name(argu1, argu2, …)

条件表达式:

selector?if-true-expression:if-false-expression

]# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

5、PATTERN

(1) empty:空模式,匹配每一行;

(2) /regular expression/:仅处理能够被此处的模式匹配到的行;

(3) relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;

真:结果为非0值,非空字符串;

(4) line ranges:行范围,

startline,endline:/pat1/,/pat2/

注意: 不支持直接给出数字的格式

]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd

(5) BEGIN/END模式

BEGIN{}: 仅在开始处理文件中的文本之前执行一次;

END{}:仅在文本处理完成之后执行一次;

6、常用的action

(1) Expressions

(2) Control statements:if, while等;

(3) Compound statements:组合语句;

(4) input statements

(5) output statements

7、控制语句

if(condition) {statments}

if(condition) {statments} else {statements}

while(conditon) {statments}

do {statements} while(condition)

for(expr1;expr2;expr3) {statements}

break

continue

delete array[index]

delete array

exit 

{ statements }

7.1 if-else

语法:if(condition) statement [else statement]

]# awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd
]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd 
]# awk '{if(NF>5) print $0}' /etc/fstab
]# df -h | awk -F[%] '/^\/dev/{print $1}' | awk '{if($NF>=20) print $1}'

使用场景:对awk取得的整行或某个字段做条件判断;

7.2 while循环

语法:while(condition) statement

条件“真”,进入循环;条件“假”,退出循环;

使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;

]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg

7.3 do-while循环

语法:do statement while(condition)

意义:至少执行一次循环体

7.4 for循环

语法:for(expr1;expr2;expr3) statement

for(variable assignment;condition;iteration process) {for-body}

]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg

特殊用法:

能够遍历数组中的元素;

语法:for(var in array) {for-body}

7.5 switch语句

语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}

7.6 break和continue

break [n]

continue

7.7 next

提前结束对本行的处理而直接进入下一行;

]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd

8、array

关联数组:array[index-expression]

index-expression:

(1) 可使用任意字符串;字符串要使用双引号;

(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”;

若要判断数组中是否存在某元素,要使用”index in array”格式进行;

weekdays[mon]=”Monday”

若要遍历数组中的每个元素,要使用for循环;

for(var in array) {for-body}

]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'

注意:var会遍历array的每个索引;

state[“LISTEN”]++

state[“ESTABLISHED”]++

]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'
]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log

统计/etc/fstab文件中每个文件系统类型出现的次数;

]# awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab

统计指定文件中每个单词出现的次数;

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

9、函数

9.1 内置函数

数值处理:

rand():返回0和1之间一个随机数;

字符串处理:

length([s]):返回指定字符串的长度;

sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;

gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;

split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;

]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'

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

]# sed 's#^[[:space:]]\+##' /etc/grub.conf

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

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

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

]# sed '1~2w /tmp/fstab.3' /etc/fstab

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

]# echo "/etc/sysconfig/network-scripts/ifcfg-eth0" |sed -r 's#^/.*/([^/]+)/?$#\1#g'
ifcfg-eth0
]# echo "/etc/sysconfig/network-scripts/ifcfg-eth0" |sed -r 's#[^/]+/?$##g'
/etc/sysconfig/network-scripts/

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

]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(j in count){print j,count[j]}}' count.txt

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

]# ss -tan|awk '!/^State/ {state[$1]++}END{for(i in state) print i,state[i]}'
ESTAB 2
LISTEN 4

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

]# awk '{ip[$1]++}END{for(i in ip) print i,ip[i]}' /var/log/httpd/access_log                 
192.168.0.100 4
192.168.0.21 4

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

#!/bin/bash
declare -a fileNames

for fn in /var/log/*.log;do
    rows=$(cat $fn|wc -l)
    fileNames[${#fileNames[@]}]=${fn##*/}
    printf "%-30s %s\n" ${fn##*/} $rows
done

执行结果:
]# ./countrow.sh  
anaconda.ifcfg.log             86
anaconda.log                   290
anaconda.program.log           433
anaconda.storage.log           2869
anaconda.yum.log               415
boot.log                       29
dracut.log                     1953
mysqld.log                     0
yum.log                        55

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

#!/bin/bash

students=(Lilei Hanmeimei Lucy Lily Tom Jerry John Polly UncleWang)
total=${#students[@]}

if [ $# -gt 1 ];then
    echo "Usage $0 [ARG1]"
    exit 1
elif [ $# -eq 1 ];then
    if [[ ! $1 =~ [0-9] ]];then
        echo "Invalid argument!"
        exit 1
    fi
    if [ $1 -ge 1 ] && [ $1 -le $total ];then
        for((i=1;i<=$1;i++));do
            rand=$[$RANDOM%$total]
            choiceStu[${#choiceStu[@]}]=${students[$rand]}
            list=()
            for j in ${students[@]};do
                if [ "$j" != "${students[$rand]}" ];then
                    list[${#list[@]}]=$j
                fi
            done
            students=(${list[@]})
            total=${#students[@]}
        done
        echo "Choice: ${choiceStu[@]}"
    else
        echo "Please choice the number [1~$total]"
    fi
elif [ $# -eq 0 ];then
    total=${#students[@]}
    rand=$[$RANDOM%$total]
    echo "Choice: ${students[$rand]}"
fi
执行结果:
]# ./answer.sh 
Choice: Polly
]# ./answer.sh 2
Choice: Polly Tom
]# ./answer.sh 3
Choice: Lucy Hanmeimei Lily
]# ./answer.sh 4
Choice: Lilei Polly Lucy Lily
]# ./answer.sh 5
Choice: Polly UncleWang Jerry Hanmeimei Lucy
]# ./answer.sh 6
Choice: Lily Lilei John Lucy UncleWang Hanmeimei
]# ./answer.sh 7
Choice: Lilei Polly Hanmeimei Tom Lucy John Jerry
]# ./answer.sh 8
Choice: Lucy Jerry Tom Lilei UncleWang Lily John Polly
]# ./answer.sh 9
Choice: Lily Hanmeimei UncleWang Lilei John Tom Jerry Polly Lucy
]# ./answer.sh 10
Please choice the number [1~9]
]# ./answer.sh abc
Invalid argument!
]# ./answer.sh 1 2
Usage ./answer.sh [ARG1]

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

使用root用户执行visudo命令,添加下面配置:

]# visudo
...
centos          ALL=(ALL)       NOPASSWD:/sbin/fdisk,/sbin/mkfs,/sbin/mke2fs
...

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

由于逻辑卷管理的相关命令较多,所以可以使用别名方式定义相关的命令

]# visudo
...
Cmnd_Alias LVADMINS_CMD=/sbin/lvchange,/sbin/lvdisplay,/sbin/lvmchange,/sbin/lvmdiskscan,/sbin/lvmsadc,/sbin/lvremove,
/sbin/lvs,/sbin/lvconvert,/sbin/lvextend,/sbin/lvmconf,/sbin/lvmdump,/sbin/lvmsar,/sbin/lvrename,/sbin/lvscan,/sbin/lv
create,/sbin/lvm,/sbin/lvmconfig,/sbin/lvmetad,/sbin/lvreduce,/sbin/lvresize,/sbin/pvchange,/sbin/pvck,/sbin/pvcreate,
/sbin/pvdisplay,/sbin/pvmove,/sbin/pvremove,/sbin/pvresize,/sbin/pvs,/sbin/pvscan,/sbin/vgcfgbackup,/sbin/vgck,/sbin/v
gdisplay,/sbin/vgimport,/sbin/vgmknodes,/sbin/vgrename,/sbin/vgsplit,/sbin/vgcfgrestore,/sbin/vgconvert,/sbin/vgexport
,/sbin/vgimportclone,/sbin/vgreduce,/sbin/vgs,/sbin/vgchange,/sbin/vgcreate,/sbin/vgextend,/sbin/vgmerge,/sbin/vgremov
e,/sbin/vgscan                #使用命令别名LVADMINS_CMD定义相关的命令

gentoo          ALL=(ALL)       NOPASSWD:LVADMINS_CMD               #引用命令别名

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

]# vim /etc/security/time.conf 
...
sshd;*;!root;MoTuWeThFr0900-1800            #限制除root用户外所有用户只能在周一至周五09:00~18:00之间通过sshd登录服务器

]# vim /etc/pam.d/sshd
...
account     required     pam_time.so        #在account类认证功能的第一行添加pam_time.so模块
...

结果测试:

]# date 04180830                            #将服务器时间修改为非工作时间
]$ ssh centos@192.168.0.21
centos@192.168.0.21's password: 
Connection closed by 192.168.0.21           #登录失败

]# date 04180930                            #将服务器时间修改为工作时间
]$ ssh centos@192.168.0.21
centos@192.168.0.21's password: 
Last login: Tue Apr 18 09:00:06 2017 from 192.168.0.61         #登录成功

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

]# vim /tmp/sshuser.lst           #创建sshd用户列表文件,仅允许centos和gentoo用户登录
centos
gentoo

]# vim /etc/pam.d/sshd
auth       requisite    pam_listfile.so \
onerr=succeed item=user sense=allow file=/tmp/sshuser.lst       #将pam_listfile.so认证方式添加在auth类认证的第一行
...

测试结果:

]$ ssh fedora@192.168.0.21
fedora@192.168.0.21's password: 
Permission denied, please try again.         #fedora用户ssh登录失败

]# ssh centos@192.168.0.21
centos@192.168.0.21's password: 
Last login: Tue Apr 18 09:41:05 2017 from 192.168.0.21

]# ssh gentoo@192.168.0.21
gentoo@192.168.0.21's password: 
Last login: Tue Apr 18 09:44:58 2017 from 192.168.0.21    #centos和gentoo用户均能成功ssh登录

以上所述就是小编给大家介绍的《第十五周作业》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Defensive Design for the Web

Defensive Design for the Web

37signals、Matthew Linderman、Jason Fried / New Riders / 2004-3-2 / GBP 18.99

Let's admit it: Things will go wrong online. No matter how carefully you design a site, no matter how much testing you do, customers still encounter problems. So how do you handle these inevitable bre......一起来看看 《Defensive Design for the Web》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换