6.shell脚本基础和grep文本处理工具企业应用

6.1shell脚本基础-bash变量和逻辑运行

bash特性及bash脚本编程初步

    终端:附着在终端接口程序:
        GUI:KDE,GNome,Xfce
        CLI:/etc/shells

    bash的特性
        命令行展开:~,{}
        命令别名:alias,unalias
        命令历史: history
        文件名通配:glob
        快捷键:Ctrl+a, e, u, k, l
        命令补全: $PATH
        路径补全:

    bash特性之:命令hash
        缓存此前命令的查找结构:key-vlaue
             key:搜索值
             value:值

        hash命令:
            hash:列出
            hash -d COMMAND: 删除
            hash -r:清空

        hash的特性之:变量
            程序:指令+数据
                指令:由程序文件提供
                数据:IO设备、文件、管道、变量

            程序:算法+数据结构

            变量名+指向的内存空间

            变量赋值:name=value
            变量类型:存储格式、表示数据范围、参与的运算
                编程语言:
                    强类型变量
                    弱类型变量:
                        hash把所有变量统统视作字符型
                        hash中的变量无需事先声明:相当于,把声明和赋值过程同时实现:
                            声明:类型 变量名
            变量替换:把变量名出现的位置替换为其所指向的内存空间中的数据
            变量引用:${var_name} $var_name
            变量名:变量名只能包含数字、字母和下划线,而且不能以数字开头
                变量名:见名知义,命令机制遵循某种法则,不能够使用程序的保留字,例如if,else,then,while等

             hash变量类型:
                本地变量:作用域仅为当前shell进程
                环境变量:作用域为当前shell进程及其子进程
                局部变量:作用域仅为某代码片断(函数上下文)

                位置参数变量:当执行脚本的shell进程传递的参数
                特殊变量:shell内置的有特殊功用的变量
                    $?:
                        0:成功
                        1-255:失败

                本地变量:
                    变量赋值:name=value
                    变量引用:${name},$name
                        "":变量名会替换为其值
                        ‘‘:变量名不会替换为其值
                    查看变量:set
                    撤销变量:unset name
                        注意:此处非变量引用

                环境变量:
                    变量赋值:
                        (1)export name=value
                        (2)name=value
                            export name
                        (3)declare -x name=value
                        (4)name=value
                            declare -x name

                    变量引用:${name},$name

                    注意:hash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境
                        PATH,HISTFILE,HISTSIZE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,UID,PWD,OLDPWD

                    查看环境变量:export,declare -x,printenv,env
                    撤销变量:unset name

                只读变量:
                    (1)declare -r name
                    (2)readonly name
                    只读变量无法重新赋值,并且不支持撤销:存活时间为当前shell进程的生命周期,随shell进程终止而终止

        bash特性之多命令执行:
             ~]# COMMAND1;COMMAND2;COMMAND3;...

             逻辑运算:
                运算数:真(true,yes,on,1)
                        假(false,no,off,0)

                与:
                    1 && 1 = 1
                    1 && 0 = 0
                    0 && 1 = 0
                    0 && 0 = 0
                或:
                    1 && 1 = 1
                    1 && 0 = 1
                    0 && 1 = 1
                    0 && 0 = 0
                非:
                    !1 = 0
                    !0 = 1
            短路法则:
                ~]# COMMAND1 && COMMAND2
                    COMMAND1为假,则COMMAND2不会再执行
                    否则,COMMAND1为真,则COMMAND2必须执行

                ~]# COMMAND1 || COMMAND2
                    COMMAND1为真,则COMMAND2不会再执行
                    否则,COMMAND1为假,则COMMAND2必须执行    

6.2shell脚本基础-bash脚本编程基础及配置文件

shell脚本编程
  编程语言的分类:根据运行方式
    编译运行:源代码-->编译器(编译)-->程序文件
    解释运行:源代码-->运行时启动解释器,由解释器边解释边运行

  根据其编程过程中功能的实现是调用库还是调用外部的程序文件
    shell脚本编程:
      利用系统上的命令及编程组件进行编程
    完整编程:
      利用库或编程组件编程

  根据编程模型:过程式编程语言,面向对象的编程语言
    程序=指令+数据
    过程式:以指令为中心来组织代码,数据是服务于代码
      顺序执行
      选择执行
      循环执行
    对象式:以数据为中心来组织代码,围绕数据来组织指令
      类(class):实例化对象,method

  shell脚本编程:过程式编程,解释运行,依赖于外部程序文件运行;

  如何写shell脚本:
    脚本文件第一行:顶格:给出shebang,解释器路径,用于指明解释执行当前脚本的解释器程序文件
      常见的解释器: 
        #!/bin/bash
        #!/usr/bin/python
        #!/usr/bin/perl

  文本编程器:
    行编辑器:sed
    全屏编辑器:nano,vi,vim

  shell脚本是什么?
    命令的堆积但很多命令不具有幂等性,需要用程序逻辑来判断运行条件是否满足,以运行发生错误

  运行脚本:
    (1)赋予执行权限,并直接运行此程序文件
      chmod +x /PATH/TO/SCRIPT_FILE
      /PATH/TO/SCRIPT_FILE
    (2)直接运行解释器,将脚本以命令行参数解释器程序
      bash /PATH/TO/SCRIPT_FILE

    注意:脚本中的空白行会被解释器忽略
      脚本中,除了shebang,余下所以以#开头的行,都会被视作注释行而被忽略,此即为注释行

  练习1:写一个脚本,实现如下功能:
    (1)显示/etc/目录下所有以大写P或小写p开头的文件或目录本身
    (2)显示/var目录下的所有文件或目录本身,并将显示结果中的小写字母转换为大写后显示
    (3)创建临时文件/tmp/myfile.XXXX

  bash的配置文件:
    两类:
      profile类:为交互式登录的shell进程提供配置
      bashrc类:为非交互式登录的shell进程提供配置

  登录类型:
    交互式登录shell进程:
    直接通过某终端输入账号和密码后登录打开的shell进程;
    使用su命令:su - USERNAME,或者使用su -l USERNAME执行

  非交互式登录shell进程:
    su USERNAME执行的登录切换
    图形界面下打开的终端
    运行脚本

  profile类:
    全局:对所有用户都生效
      /etc/profile/
      /etc/profile.d/*.sh

  用户个人:仅对当前用户有效:
      ~/.bash_profile

    功用:
      1、用于定义环境变量
      2、运行命令或脚本

  bashrc类:
    全局:
      /etc/bashrc
    用户个人:
      ~/.bashrc

    功用:
      1、定义本地变量
      2、定义命令别名
      注意:仅管理员可修改全局配置文件

   交互式登录shell进程:
    /etc/profile-->/etc/profile.d/*-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
   非交互式登录shell进程:
    ~/.bashrc-->/etc/bashrc--/etc/profile.d/*

   命令行中定义的特性,例如变量为别名仅对当前shell进程的生命周期:
    配置文件定义的特性,只对随后新启动的shell进程有效;

   让通过配置文件定义的特性立即生效:
    (1)通过命令行重复定义一次
    (2)让shell进程重读配置文件:
      ~]# source /PATH/FROM/CONF_FILE
      ~]# . /PATH/FROM/CONF_FILE

  问题1:定义对所有用户都生效的命令别名,例如lftps=‘lftp 172.16.0.1/pub‘
  问题2:让CentOS用户登录时,提供其已经登录,并显示当前系统时间?

 6.3运维核心技能-grep命令与基本正则表达式

文本处理工具:
    Linux上文本处理三剑客:
        grep:文本过滤工具(模式:pattern)工具
        sed: stream editor,流编辑器,文本编辑工具
        awk:Linux上的实现为gawk,文本报告生成器(格式化文本)

    正则表达式:Regual Expression REGEXP
        由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能
            分两类:
                基本正则表达式: BRE
                扩展正则表达式: ERE

        元字符:\(hello[[:space:]]\+\)\+

    grep:Global search REgular expression and Print out the line.
        作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行

        模式:由正则表达式的元字符及文本字符所编写出的过滤条件

        正则表达式引擎:

        grep [OPTIONS] pattern [FILE...]

            OPTIONS:
                --color=auto:对匹配到的文本着色后高亮显示
                -i:ignorecase,忽略文本的大小写
                -o:仅显示匹配到的字符串本身
                -v,--invert-match:显示不能被模式匹配到的行
                -E:支持使用扩展的正则表达式元字符
                -q,--quiet,--silent:静默模式,即不输出任何信息

                -A #:after,后#行
                -B #:before,前#行
                -C #:context,前后各#行

            基本正则表达式元字符:
                字符匹配:
                    .:匹配任意单个字符
                    []:匹配指定范围内的任意单个字符
                    [^]:匹配指定范围外的任意单个字符
                        [[:digit:]],[[:alpha:]],[[:lower:]],[[:upper:]],[[:alnum:]],[[:punct:]],[[:space:]]

                匹配次数:用在要指定其出现的次数的字符的后面,用于限制 其前面字符出现的次数:默认工作于贪婪模式
                    *:匹配其前面的字符任意次:0,1多次
                    .*:匹配任意长度的任意字符
                    \?:匹配其前面的字符0次或1次,即其前面的字符是可有可无的
                    \+:匹配其前面的字符1次或多次,即其前面的字符要出现至少1次
                    \{m\}:匹配其前面的字符m次
                    \{m,n\}:匹配其前面的字符至少m次,至多nu次
                        \{0,n\}:至多n次
                        \{m,\}:至少m次

                位置锚定:
                    ^:行首锚定:用于模式的最左侧
                    $:行尾锚定:用于模式的最右侧
                    ^PATTERN$:用于PATTERN来匹配整行
                        ^$:空白行:
                        ^[[:space:]]*$:空行或包含空白字符的行

                    单词:非特殊字符组成的连续字符(字符串)都称为单词:

                    \<或\b:词首锚定,用于单词模式的左侧
                    \>或\b:词尾锚定,用于单词模式的右侧
                    \<PATTERN\>:匹配完整单词

                练习:
                    1、显示/etc/passwd中不以/bin/bash结尾的行
                        grep -v "/bin/bash$" /etc/passwd
                    2、找出/etc/passwd两位数或三位数
                        grep "\<[0,9]\{2,3\}\>" /etc/passwd
                    3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行
                        grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
                    4、找出"netstat -tan"命令的结果中以"LISTEN"后跟0,1或多个空白字符结尾的行
                        netstat -tan | grep "LISTEN[[:space:]]*$"
                分组及引用:
                    \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理:
                        \(xy\)*ab

                    Note:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
                        \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
                        \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
                        \3:
                        ...

                    后向引用:引用前面的分组括号中的模式所匹配到的字符

 6.4egrep进阶及文本处理工具应用

    egrep:
        支持扩展的正则表达式实现类似于grep文本过滤功能:grep -E

        egrep [OPTIONS] pattern [FILE...]

            OPTIONS:
                -i,-o,-q,-A,-B,-C
                -G:支持基本正则表达式

            扩展正则表达式元字符:
                字符匹配:
                    .:匹配任意单个字符
                    []:匹配指定范围内的任意单个字符
                    [^]:匹配指定范围外的任意单个字符
                        [[:digit:]],[[:alpha:]],[[:lower:]],[[:upper:]],[[:alnum:]],[[:punct:]],[[:space:]]

                匹配次数:用在要指定其出现的次数的字符的后面,用于限制 其前面字符出现的次数:默认工作于贪婪模式
                    *:匹配其前面的字符任意次:0,1多次
                    .*:匹配任意长度的任意字符
                    ?:匹配其前面的字符0次或1次,即其前面的字符是可有可无的
                    +:匹配其前面的字符1次或多次,即其前面的字符要出现至少1次
                    {m}:匹配其前面的字符m次
                    {m,n}:匹配其前面的字符至少m次,至多nu次
                        {0,n}:至多n次
                        {m,}:至少m次

                位置锚定:
                    ^:行首锚定:用于模式的最左侧
                    $:行尾锚定:用于模式的最右侧
                    \<或\b:词首锚定,用于单词模式的左侧
                    \>或\b:词尾锚定,用于单词模式的右侧

                分组及引用:
                    ():分组,括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中,
                        后向引用:\1.\2...
                或:
                    a|b:a或者b:

            练习:
                1、找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式:
                    grep -i "^s" /proc/meminfo
                    grep "^[sS]" /proc/meminfo
                    grep -E "^(s|S)" /proc/meminfo

                2、显示当前系统上root、centos或user1用户的相关信息:
                    grep -E "^(root|centos|user1)\>">/etc/passwd

                3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
                    grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

                4、使用echo命令输出一绝对路径,使用egrep取出基名

                    进一步:取出其路径名:类似于对其执行dirname命令的结果:

                5、找出ifconfig命令结果中的1-255之间的数值
                    ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

                6、课外作业:找出ifconfig命令结果中的IP地址

                7、添加用户bash,testbash,basher以及nologin(其shell为/sbin、nologin),而后找出/etc/passwd文件中用户名同shell名的行
                    grep -E "^([^:]+\>).*\1$" /etc/passwd

    fgrep:不支持正则表达式元字符:
        当无需用至元字符去编写模式时,使用fgrep必能更好

文本查看及处理工具: wc,cut,sort,uniq,diff,patch

        wc: word count
            wc [OPTION]...[FILE]...
                -l:lines
                -w:words
                -c:bytes

        cut:
            cut [OPTION]...[FILE]...
                -d CHAR:以指定的字符为分隔符:
                -f FIELDS:挑选出的字段
                    #: 指定的单个字段
                    #-#:连续的多个字段
                    #,#:离散的多个字段

        sort:
            sort [OPTION]...[FILE]...
                -n:基于数值大小而非字符进行排序
                -t CHAR:指定分隔符
                -k #:用于排序比较的字段
                -r:逆序排序
                -f:忽略字符大小写
                -u:重复的行只保留一行
                    重复行:连续且相同

        uniq:报告或移除重复的行
            uniq [OPTION]...[INPUT[OUTPUT]]
                -c:显示每行的重复次数
                -u:仅显示未曾重复过的行
                -d:仅显示重复过的行

        diff:compare files line by line
            diff [OPTION]...FILES

            diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
                -u:使用unfled机制,即显示要修改的行的上下文,默认为行 

        patch:向文件打补丁
            patch [OPTIONS] -l /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE

原文地址:https://www.cnblogs.com/43945616b/p/11265016.html

时间: 2024-08-24 17:48:51

6.shell脚本基础和grep文本处理工具企业应用的相关文章

shell脚本基础和grep使用

shell脚本基础和grep使用 一.shell脚本基础 (1).命令hash hash的作用:缓存此前命令的查找结果:key-value数据格式(键值),key:搜索键:value:值 hash的使用: 直接使用hash,列出缓存的所有命令 -d选项,hash -d COMMAND:表示清空指定命令的缓存,如hash -d ls -r选项,表示清空所有命令的缓存,hash -r (2).编程语言 强类型变量编程语言 弱类型变量编程语言:? ? (1)bash把所有变量统统视作字符型;? ? 在

续写vim,shell脚本基础编辑,read命令,if与case判断语句,文件查找方式,压缩与解压,

一. Vim续写 ?1.命令扩展模式的位置定界 ??起始位置 cmd 终止位置???Cmd:????y复制????d删除????Gu变大写????gu变小写??例如:0y$命令意味着:????0 先到行头????Y 从这里开始拷贝????$ 拷贝到本行行尾最后一个字符????Ye 从当前位置拷贝到本单词的最后一个字符 ?2.扩展命令模式:地址定界 ? ?# 具体第#行,? ?#1,#2 从开头数第#1行到第#2行? ?#1,+#2 从开头数的第#1行到从第#1行开始数的第#2行? ? ?例:2,

shell脚本基础、变量

shell脚本基础 知识要点 掌握Shell脚本的基础知识 学会使用Shell变量 学会编写简单的Shell脚本 Shell脚本的应用环境 学习shell脚本的基本流程 看.想.写 shell脚本用在什么地方 编写常用系统维护工具菜单 重要的性能参数.进程和日志分析 自动实现数据备份计划 自动批量搭建特定系统环境 防火墙自动配置脚本 服务器的配置文件安全比对 对批量设备进行远程巡检 Shell脚本的组成元素 shell脚本的基本组成 声明和注释* 系统命令 文本处理工具(grep.cut.sed

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

shell脚本基础学习(转)

看到别人的学习总结,觉得不错转了过来(转自TryFly) 一.shell脚本基础 ? ?shell脚本是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正则表达式,管道命令以及重定向向等功能,以达到我们所想要的处理目的.它的基本用途有: 1.自动化常用命令 2.执行系统管理和故障排除 3.创建简单的应用程序 4.处理文本或文件 ... 二.创建shell脚本 第一步.使用文本编辑器来创建文本文件 第一行必须包括shell 声明序列:#!

shell脚本基础进阶(四)----作业

20150913-15作业 1.描述shell程序的运行原理(可附带必要的图形说明) shell脚本基础进阶(一)----shell介绍 2.总结shell编程中所涉及到的所有知识点(如:变量.语法.命令状态等等等,要带图的哟) shell脚本基础进阶(二)----变量及运算符 3.总结课程所讲的所有循环语句.条件判断的使用方法及其相关示例:(if (jpg|png is not exist):echo "You say a XX") shell脚本基础进阶(三)----流程控制语句

Linux运维之道之ENGINEER1.4(shell脚本基础)

ENGINEER1.4 SHELL脚本基础 认识shell环境 bash shell的使用方式 交互式: --人工干预,智能化程度高 --逐条解释执行,效率低 非交互式: --需要提前设计,智能化难度大: --批量执行,效率高: --方便在后台及悄悄地执行: 什么是shell脚本:提前设计可执行语句,用来完成特定任务的文件 --解释型程序 --顺序,批量执行 规范shell脚本的一般组成: #!环境声明 #注释文本 可执行代码 ----------------------------------

Shell脚本基础(一)

前言:随着Linux系统在企业中的应用越来越多,服务器的自动化管理也越来越变得重要,在一些复杂的Linux维护工作中,大量的重复性的输出和交互式操作不但费时费力,而且容易出错,所以Shell脚本,可以批量处理,自动化完成一系列维护工作,大大减轻管理员的负担. 一,Shell脚本基础知识1,编写第一个shell脚本1),vim first.sh[[email protected] ~]# mkdir /shell //创建一个shell目录[[email protected] ~]# vim fi

什么是Shell?Shell脚本基础知识详细介绍

这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. 它虽然不是Linux系统核心