; N26-博客作业-week15 | Linux运维部落

N26-博客作业-week15

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

sed:
    语法结构
    sed [OPTION]...'script' [input-file]...[action]
        -r:支持扩展正则表达式
        -n:不输出模式空间中的内容至屏幕
        -e script1 -e script2 -e script3:指定多脚本运行
        -f /path/to/script_file:从指定的文件中读取脚本运行
        -i:直接修改源文件
    
    sed的地址定界
        #:#表示数字,指定行
        $:最后一行
        /pattern/或%pattern%:任何能被pattern匹配到的行
        
            #,/pattern/:从第#行开始,到第一次被pattern匹配到的行结束,中间的所有行
            #1,#2:从#1到#2行
            /pattern1/,/pattern2/:从第一次被pattern1匹配到的行开始,到第一次被pattern2匹配到的行结束,中间的所有行
            #,+n:从#行开始,一直到向下的n行
        1~2:所有奇数行
        2~2:所有偶数行
            
    sed的编辑命令
        d:删除模式空间中的行
        =:为模式空间中的行打印行号
        a \text:在行后面追加文本,支持使用\n实现多行追加
        i \text:在行前面追加文本,支持使用\n实现多行追加
        c \text:用text替换匹配到的行
        p:打印模式空间中的行
        s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
            替换标记:
                g:全局替换;
                w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
                p:显示替换成功的行;
        w /path/to/somefile:保存模式空间匹配到的行至指定的文件中;
        r /path/from/somefile:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
        
    高级编辑命令:
        h:把模式空间中的内容覆盖至保持空间中;
        H:把模式空间中的内容追加至保持空间中;
        g:把保持空间中的内容覆盖至模式空间中;
        G:把保持空间中的内容追加至模式空间中;
        x:把模式空间中的内容与保持空间中的内容互换;
        n:覆盖读取匹配到的行的下一行至模式空间中;
        N:追加读取匹配到的行的下一行至模式空间中;
        d:删除模式空间中的行;
        D:删除多行模式空间中的所有行;
        
awk:
    awk的运行模式有三种:
        (1)awk 命令行
            # awk
        (2)awk 程序文件
            # awk -f /path/from/awk_script
        (3)awk 脚本
            # !/bin/awk -f
            
    awk的基本用法:awk [OPTION] 'program' FILE1 FILE2...
    其中program:PATTERN{Action STATEMENT}
        program:编程语言
        PATTERN:模式
        ACTION STATEMENT:动作语句,可以是由多个语句组成,各语句间使用分号隔离;
        
    OPTONS:
        -F[]:指明输入字段分隔符;
        -v VAR_NAME=VALUE:变量赋值;
        -f /PATH/FROM/AWK_SCRIPT;
        
    awk在处理文本时也是一次读取一行文本,然后根据输入分隔符(默认为空格)进行切片,切成n个片段,然后将每一片都赋予awk内部的一个变量中进行保存,
    这些变量名为$1、$2、$3...,awk就可以对这些片段单独处理,
    
    awk的输出命令之print
        用法:print item1,item2,...
            item:字符串,用引号引用
                print "hello","world"
            变量:显示变量的值,可以直接使用变量的名进行引用
                print name 
            数值:无需加引号
            
        注:
            (1)各item之间要使用逗号隔开,输出时的分隔符默认为空白字符
            (2)输出的各item可以为字符串或数值,当前记录的字段($#),变量或awk的表达式;数值会被隐式转换为字符串进行输出
            (3)print后面的item省略时,相当于运行“print $0”,用于输出整行
            (4)输出空白字符 print " "
        变量
            分为内建变量和自定义变量
            
            内建变量:
                FS:input Field Seperator,输入字段分隔符,默认为空白字符
                RS:input Record Seperator,输入时的行分隔符,默认为换行符
                OFS:Output Field Seperatro,输出时的字段分隔符,默认为空白字符
                ORS:Output Record Seperator,输出时的行分隔符,默认为换行符
                NF:number of field in current record,当前行的字段数
                    print NF:显示当前行的字段数
                    print $NF:显示当前行的第NF字段的值
                NR:number of records,行数;命令后跟的所有文件将统一合并计数
                FNR:行数,各文件单独计数
                FILENAME:当前正被awk读取的文件的文件名
                ARGC:awk命令行中的参数的个数
                ARGV:数组,保存了命令行参数本身
                    ARGV[index]
                    ARGV[0],ARGV[1]
                    
        自定义变量
            (1)-v VAR_NAME=VALUE变量名区分字符大小写
            (2)在program中自定义变量

    awk的输出命令之printf格式化输出
        语法:printf FORMAT,item1,item2,...
        
        注:
            (1)必须提供FORMAT
            (2)与print语句不同,printf不会自动换行,需要显示指定换行符:\n
            (3)FORMAT中需要分别为后面的每个item指定一个格式符,否则item无法显示
                格式符:都以%开头,后面跟单个字符
                    %c:显示字符的ASCII码
                    %d,%i:显示为十进制整数
                    %e,%E:科学计数法或浮点数格式显示数值
                    %f:显示为浮点数
                    %g,%G:以科学计数法或浮点数格式显示数值
                    %s:显示为字符串
                    %u:显示无符号整数
                    %%:显示%符号自身
                    
    awk的操作符:
        awk的操作符有:算术操作符、字符操作符、赋值操作符、比较操作符、模式匹配操作符、逻辑操作符、条件表达式和函数调用
        
            算术操作符:实现一些算术运算
            字符操作符:字符串连接
            赋值操作符:通常为变量的赋值
                =,+=,-=,*=,/=,%=,^=
                ++,--
            比较操作符:字符串或者数值的大小比较
                >,>=,<,<=,==,!=
            模式匹配操作符:根据右侧的模式进行匹配操作
                ~:是否能由右侧指定的模式所匹配
                !~:是否不能由右侧指定的模式所匹配
            逻辑操作符:进行逻辑的运算
                &&:与运算
                ||:或运算
            条件表达式:
                selector?if-trun-expression:if-false-expression
            函数调用:调用函数来进行数据的处理
                格式:function_name(argu1,argu2,...)
            
            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{}:仅在文本处理完成之后执行一次;
            
            常用的action
                (1)Expressions
                (2)Control statements:if, while等;
                (3)Compound statements:组合语句;
                (4)input statements
                (5)output statements            
                
            控制语句
                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 }
            
            数组
                关联数组:array[index-expression]

                index-expression:
                    (1)可使用任意字符串;字符串要使用双引号;
                    (2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”;
                    若要判断数组中是否存在某元素,要使用"index in array"格式进行;
                    weekdays["mon"]="Monday"
                若要遍历数组中的每个元素,要使用for循环;
                    for(var in array) {for-body}
            
            函数
                内置函数
                    数值处理:
                        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所表示的数组中;
                自定义函数

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

# sed -r 's/^[[:space:]]+//' /boot/grub/grub.conf

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

# sed -r 's/^[#][[:space:]]+//' /etc/fstab

#
/etc/fstab
Created by anaconda on Thu Jun 15 06:05:04 2017
#
Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=78793bbc-ce37-49e2-91c3-ce7119a6c9f3 /                       xfs     defaults        0 0
UUID=b03e3066-407e-445a-8e11-08a1d91d042d /boot                   xfs     defaults        0 0
UUID=cbe5fb6e-c8ca-4e7f-84a0-c19967b93c41 swap                    swap    defaults        0 0

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

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

# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=78793bbc-ce37-49e2-91c3-ce7119a6c9f3 /                       xfs     defaults        0 0
UUID=cbe5fb6e-c8ca-4e7f-84a0-c19967b93c41 swap                    swap    defaults        0 0

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

# echo "/etc/fstab/xxxx/" | sed -r 's@^.*/([^/]+)/?$@\1@'
xxxx

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

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

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

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

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

awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/httpd/wp.access

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

# vim logcount.sh

#!/bin/bash
#
declare -a rows
declare -a FileNames

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

# bash -n logcount.sh
# bash logcount.sh
boot.log                       236
vmware-vmsvc.log               413
vmware-vmusr.log               21
wpa_supplicant.log             19
Xorg.0.log                     404
yum.log                        723

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

#!/bin/bash
#
declare -a Students

Students=(Jose David Antonio Eric Victor Luke Ander Paul Michael Lukaku Mkhitaryan Rashford)

read -p "Please chose a number [1-${#Students[@]}]: " num

if [[ $num -lt 1 || $num -gt 12 ]];then
    echo -e  "An error choise!\nPlease chose from 1-${#Students[@]}"
    exit 2
else
    for ((i=0;i<$num;i++))
        do
            x=$[$RANDOM % ${#Students[@]}]
            echo ${Students[$x]}
            Students[$x]=${Students[${#Students[@]}-1]}
            unset Students[${#Students[@]}-1]
        done
fi

# bash students.sh 
Please chose a number [1-12]: 4
Eric
Ander
Lukaku
Antonio

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

# visudo
centos  ALL=(root)  /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                

gentoo          ALL=(ALL)       NOPASSWD:LVADMINS_CMD

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

# vim /etc/pam.d/sshd
account  required  pam_time.so

# vim /etc/security/time.conf
sshd;*;*;MoTuWeThFr0900-1800

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

# vim /etc/user_list
centos
fedora

# chmod 600 /etc/sshd_userlist

# vim /etc/pam.d/sshd
auth  required  item=user sense=allow file=/etc/users onerr=succeed

原创文章,作者:浙江-咲,如若转载,请注明出处:/80423

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论列表(1条)

  • 马哥教育
    马哥教育 2017-07-22 21:43

    sed, awk在手,天下我有,加油。

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达娱乐直属  万达娱乐主管  万达娱乐注册  万达娱乐招商  万达招商  guoqibee.com  万达娱乐  万达娱乐招商  万达娱乐直属QQ  华宇招商