小红帽第6集

  |  

小红帽第6集:
egrep、bash环境配置及脚本、vim编辑器

egrep及bash中的变量

egrep及扩展的正则表达式

  egrep = grep -E

  egrep [OPTIONS] PATTERN [FILE…]

  fgrep:不支持正则表达式,而是直接搜索,这样速度较快

  扩展正则表达式的元字符:

    字符匹配:

      .,[],[^]

    次数匹配:

      *,?,+,{m},{m,},{m,n},{0,n}

    位置锚定:

      ^,$,\<,\>,\b,

    分组:

      (),后向引用:\1,\2,…

    或者:

      a|b:C|cat 表示C或者cat而不是表示Cat或cat如果要表示这种需要:(C|c)at

    egrep举例如下:

[zhangshuo@localhost ~]$ #1、显示当前系统root,git,或zhangshuo用户的默认shell和UID
[zhangshuo@localhost ~]$ egrep "^(root|git|zhangshuo)\>" /etc/passwd | cut -d : -f 1,3,7
root:0:/bin/bash
zhangshuo:1000:/bin/bash
[zhangshuo@localhost ~]$ #2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
[zhangshuo@localhost ~]$ egrep "\<[[:alpha:]]+\>\(\)" /etc/rc.d/init.d/functions
checkpid() {
daemon() {
killproc() {
[zhangshuo@localhost ~]$ #3、使用echo输出一路径,使用egrep取出其基名
[zhangshuo@localhost ~]$ echo "/etc//passwd/" | egrep -o "[^/]+/?$" | cut -d / -f 1
passwd
[zhangshuo@localhost ~]$ echo "/etc//passwd/" | egrep -o "/[[:alpha:]]+/?$" | cut -d / -f 2
passwd
[zhangshuo@localhost ~]$ #4、找出ifconfig命令结果中1-255之间的数值
[zhangshuo@localhost ~]$ ifconfig | egrep -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
10
2
15
255
255
[zhangshuo@localhost ~]$ #5、找出ifocnifg命令结果中的IP地址
[zhangshuo@localhost ~]$ ifconfig | egrep -o "(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.){3}\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
10.8.76.166
10.8.255.255
192.168.122.1
192.168.122.255

bash的基础特性(4)

  变量类型:决定了数据存储格式,存储空间大小,参与运算种类

    字符型:

    数值型:数值型又包括

      整型:

      浮点型:

  对于强类型的语言:定义变量时必须指定类型,参与运算必须符合类型要求,调用未声明的变量会报错

  对于若类型的语言(shell):无需指定类型,默认均为字符型,参与运算会自动进行隐式类型转换,变量无需事先定义可直接调用

  bash中的变量的种类:

    本地变量:生效范围为当前shell进程,对当前shell之外的其它shell进程包括当前shell的子进程均无效

    环境变量:生效范围为当前shell进程及其子进程

    局部变量:生效范围为当前shell进程中某代码片段(通常指函数)

    位置变量:$1,$2,…来表示用于让脚本代码中调用通过命令行传递给它的参数

    特殊变量:$?,$0,$#,$*,$@

  本地变量:

    变量赋值:name=”VALUE”

    对于VALUE可以使用引用:

      (1):可以是直接字串:name=”username”

      (2):变量引用:name=”$username”

      (3):命令引用:name=`COMMAND`或name=$(COMMAND)

    变量引用:

      ””:弱引用,其中的变量引用会被替换为变量值

      ’’:强引用,其中的变量引用不会被替换为变量值,而保持原字符串本身

    显示定义的所有变量:

      命令:set

    销毁变量:

      命令:unset name

  环境变量:

    变量声明和赋值

      export name=VALUE

      declare -x name=VALUE

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

    显示所有的环境变量:

      命令:export env printenv

    销毁变量: unset name

    bash中许多内建的环境变量:PATH,SHELL,UID,HISTSIZE,HISTFILE,HISTCONTROL,OLD,PWD,HOME,PS1等

  变量的命名法则:

    1、不能使用程序中的保留字:例如if,for等

    2、只能使用数字,字母及下划线,且不能以数字开头

    3、尽量做到见名知义

  只读变量:

    使用readonly name 来定义或

    declare -r name

    注意:只读变量只要被定义则再改shell进程结束之前禁止修改和撤销

  位置变量:

    在脚本代码中调用通过命令行传递给脚本的参数

    $1,$2,…对应调用第1个,第2个参数

  特殊变量:

    $?:命令执行状态返回值

    $0:命令本身

    $*:传递给脚本的所有参数当作一个字串

    $@:传递给脚本的所有参数,每一个当作一个字串

    $#:传递给脚本的参数的个数

    在脚本中可以使用shift [n]来进行轮换

bash环境配置及脚本

bansh环境配置

  bash的配置文件

    按生效范围划分存在两类:

      全局配置:/etc/profile /etc/profile.d/*.sh /etc/bashrc

      个人配置:~/.bashrc ~/.bash_profile

    按功能划分:

      profile类:为交互式登陆的shell提供配置

        功用:

          (1)、定义环境变量

          (2)、运行命令或脚本

      bashrc类:为非交互式登陆的shell提供配置

        功用:

          (1)、定义命令别名

          (2)、定义本地变量

    shell登陆类别划分

      交互式登陆:

        直接通过终端输入账号密码登陆

        使用su - username或su -l username切换致的用户

      非交互式登陆

        su username

        图形界面下打开的终端

        执行脚本运行的终端

    登陆式shell获取配置文件次序

      /etc/profile–>/etc/profile.d/*.sh–>~/.bash_profile–>~/.bashrc–>/etc/bashrc

    非登陆式shell获取配置文件次序

      ~/.bashrc–>/etc/bashrc–>/etc/profile.d/*.sh

bash中的算数运算符

  (1)、let var=算术表达式

  (2)、var=$[算术表达式]

  (3)、var=$((算术表达式))

  (4)、var=$(expr arg1 arg2 arg3 …)

  各算法运算表示如下

[zhangshuo@localhost ~]$ A=3
[zhangshuo@localhost ~]$ B=5
[zhangshuo@localhost ~]$ let C=$A+$B
[zhangshuo@localhost ~]$ echo $C
8
[zhangshuo@localhost ~]$ echo "$[$A+$B]"
8
[zhangshuo@localhost ~]$ echo "$(($A+$B))"
8
[zhangshuo@localhost ~]$ echo "$(expr $A \* $B)"
15

  注意:乘法符号有些场景中需要转义

  bash有内建的随机数生成器:$RANDOM 例如取出1-60中的随机数

[zhangshuo@localhost ~]$ echo "$[$RANDOM%60+1]"
35

  增强型赋值:let count+=1 ,let count++ ,count=$[$count+1]可以实现变量自加一

  对于数值计算举例如下:

[zhangshuo@localhost bin]$ #1、写一个脚本,计算/etc/passwd文件中的第10个用户和第20个用户的id之和
[zhangshuo@localhost bin]$ pwd
/home/zhangshuo/bin
[zhangshuo@localhost bin]$ vim sumid.sh
[zhangshuo@localhost bin]$ cat sumid.sh
#!/bin/bash
#by 张硕 20180731
user10id=$(head -10 /etc/passwd | tail -1 | cut -d : -f 3)
user20id=$(head -20 /etc/passwd | tail -1 | cut -d : -f 3)
idsum1020=$[$user10id+$user20id]
echo "id20 and id10 id sum is $idsum1020"
[zhangshuo@localhost bin]$ chmod +x sumid.sh
[zhangshuo@localhost bin]$ ./sumid.sh
id20 and id10 id sum is 70
[zhangshuo@localhost bin]$ #2、写一个脚本,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
[zhangshuo@localhost bin]$ vim blackline.sh
[zhangshuo@localhost bin]$ cat blackline.sh
#!/bin/bash
#by 张硕 20180731
file1spacenum=$(grep "^[[:space:]]*$" $1 | wc -l)
file2spacenum=$(grep "^[[:space:]]*$" $2 | wc -l)
numsum=$[$file1spacenum+$file2spacenum]
echo "space line num is $numsum"
[zhangshuo@localhost bin]$ chmod +x blackline.sh
[zhangshuo@localhost bin]$ ./blackline.sh /etc/passwd /etc/rc.d/init.d/functions
space line num is 90
[zhangshuo@localhost bin]$ #3、统计/etc/,/var/,/usr目录共有多少个一级子目录和文件
[zhangshuo@localhost bin]$ vim gitline.sh
[zhangshuo@localhost bin]$ cat gitline.sh
#!/bin/bash
#by 张硕 20180731
etclines=$(ls /etc | wc -l)
varlines=$(ls /var | wc -l)
usrlines=$(ls /usr | wc -l)
linesnum=$[$etclines + $varlines + $usrlines]
echo "lines sum is $linesnum"
[zhangshuo@localhost bin]$ chmod +x gitline.sh
[zhangshuo@localhost bin]$ ./gitline.sh
lines sum is 324

bash中的条件测试

  判断某需求是否满足,需要由测试机制来实现

  注意:专用的测试表达式需要由测试命令辅助完成测试过程

  测试命令:

    test EXPRESSION

    [ EXPRESSION ]

    [[ EXPRESSION ]]

    注意:EXPRESSION前后必须有空白字符

  bash的测试类型:

    数值测试:

    字符串测试:

    文件测试:

  数值测试:

    -gt:是否大于

    -le:是否小于等于

    -ge:是否大于等于

    -eq:是否相等

    -ne:是否不想等

    -lt:是否小于

  字符串测试:

    ==:是否等于

    >:是否大于

    <:是否小于

    !=:是否不等于

    =~:左侧字符串是否能够被右侧的PATTERN所匹配到

      注意:此表达式一般用于[[]]测试符号中

    -z “STRING”:测试字符串是否为空,空则为真,不空则为假

    -n “STRING”:测试字符串是否不空,不空则为真,空则为假

  bash自定义退出状态码

    在脚本中需要退出的位置使用命令exit [n]即可自定义退出状态码

      注意:脚本中一旦遇到exit命令,脚本会立即终止,终止退出状态取决于exit命令后面的数字

    注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

    脚本中自定义错误码举例如下:

[zhangshuo@localhost bin]$ #写一个脚本,接受一个文件路径作为参数,如果参数个数小于1,则提示用户至少应给一个参 数,并立即退出,如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
[zhangshuo@localhost bin]$ vim myexit.sh
[zhangshuo@localhost bin]$ cat myexit.sh
#!/bin/bash
#by zhangshuo 20180731
[ $# -lt 1 ] && echo "至少应给一个参数" && exit 2
spacelinenum=$(grep "^[[:space:]]*$" $1 | wc -l)
echo "first file space line num is $spacelinenum"
[zhangshuo@localhost bin]$ chmod +x myexit.sh
[zhangshuo@localhost bin]$ ./myexit.sh
至少应给一个参数
[zhangshuo@localhost bin]$ echo $?
2
[zhangshuo@localhost bin]$ ./myexit.sh /etc/rc.d/init.d/functions
first file space line num is 90

vim编辑器

vim简单介绍

  vi:Visual Interface 可视化接口编辑器

  文本编辑器种类:

    行编辑器:sed

    全屏编辑器:nano,vi等

  vim:vi iMproved :模式化编辑器

    基本模式:

      编辑模式,命令模式:

      输入模式:

      末行模式:

        内置的命令行接口

  打开文件:

    vim [OPTION]…FILE…

      +#:打开文件后,直接让光标处于第#行的行首

      +/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行首

      +:直接到文件末尾

  模式转换:

    编辑模式–>输入模式

      i:insert,在光标所在处转为输入模式

      a:append,在光标所在处后面转为输入模式

      o:在当前光标所在行的下方打开一个新行转为输入模式

      I:在当前光标所在行的行首转为输入模式

      A:在当前光标所在行的行尾转为输入模式

      O:在当前光标所在行的上方打开一个新行转为输入模式

    输入模式–>编辑模式

      按ESC键即可

    编辑模式–>末行模式

      :

    末行模式–>编辑模式

      按ESC键,一次不行就多按几次

  关闭文件:

    在末行模式下:

      :q 退出

      :q! 强制退出,丢弃做出的修改

      :wq 保存退出

      :x 保存退出

      :w /PATH/TO/SOMEWHERE 保存文件内容到其他文件,相当于office下的另存为

    在编辑模式下:

      ZZ 按两次大写的Z直接保存退出

  光标跳转:

    字符间跳转:

      h:光标向左移动一个字符

      j:光标向上移动一行

      k:光标向下移动一行

      l:光标向右移动一个字符

      以上命令还可以和数字组合:# COMMAND 跳转由#指定的个数的字符

    单词间跳转:

      w:移动到下一个单次的词首

      e:移动到下一个单次的词尾

      b:移动到上一个单次的词首

    行首行尾跳转:

      ^:跳转至行首的第一个非空白字符

      0:跳转至绝对行首

      $:跳转至行尾

    行间跳转:

      # G:跳转至由#指定行

      G:跳转至文件最后一行

      gg,或1G:跳转至文件第一行

    句间移动:

      ):跳转至下一句句首

      (:跳转至上一句的句首

    段落间移动:

      {:移动到段首

      }:移动到段尾

  vim的编辑命令:

    字符编辑:

      x:删除光标处的字符

      # x:删除光标处起始的#个字符

      xp:交换光标所在处的字符及其后面字符的位置

    删除命令:

      d:删除命令,可结合光标跳转字符,实现范围删除

      d$,d^,d0,dw,dw,de,db

      也可以和数字键组合使用:# COMMAND

      dd:删除一整行

        #dd:实现多行删除

    粘贴命令:

      p:缓冲区保存的如果为整行,则粘贴至当前光标所在行的下方,否则则粘贴至当前光标所在处的后面

      P:缓冲区保存的如果为整行,则粘贴至当前光标所在行的上方,否则则粘贴至当前光标所在处的前面

    复制命令:

      y:复制,使用同d一样

    改变命令:

      c:修改,相当于d命令后再进行输入,使用该命令也可以实现从编辑模式到输入模式的转换

    替换命令:

      r:替换光标所在处的字符

    可视化模式:

      v:按字符选定

      V:按行选定

      注意:可视化模式选定范围后通常会和d,c,y命令进行组合

  撤销此前的编辑:

    u(undo):撤销此前的操作

    #u:撤销指定次数的操作

  撤销此前的撤销:

    Ctrl+r

  重复前一个编辑操作:

    .

  翻屏操作:

    Ctrl+f:向文件尾部翻一屏

    Ctrl+b:向文件首部翻一屏

    Ctrl+d:向文件尾部翻半屏

    Ctrl+u:向文件首部翻半屏

  vim自带的练习教程

    vimtutor

  vim中的末行模式:

    内建的命令行接口

    (1)地址定界

      :start_pos,end_pos

        #:具体第#行,例如2表示第2行

        #,#:从左侧#表示行起始,到右侧#表示行结尾

        #,+#:从左侧#表示的行起始,加上右侧#表示的行数

        .:表示当前行

        $:表示到最后一行

        .,$-1:表示从当前行到倒数第二行

      %:全文,相当于1,$

      /pat1/,/pat2/:从第一次被pat1模式匹配到的行开始一直到第一次被pat2匹配到的行结束

      使用方式:

        后跟一个编辑命令:

        d,y,w,/path/to/somewhere

        r /path/from/somefile:在指定位置插入指定文件中的所有内容

    (2)查找

      和less命令的用法类似

      /PATTERN

      ?PATTERN

        n:与命令查找方向相同来查找下一个

        N:与命令查找方向相反来查找下一个

    (3)查找并替换

      s:在末行模式下完成查找替换操作

      s/要查找的内容/替换为的内容/修饰符

        要查找的内容:可使用模式进行匹配

        替换为的内容:不能使用模式,但可以使用\1,\2,等后向引用符号,还可以使用”&”引用前面查找时查找到的整个内容

        修饰符:

          i:忽略大小写

          g:全局替换,默认情况下,每一行只替换第一次出现

      例如:

        .,$s/r\(..\)t/R\1t/g

        %s/l…x/&er/g

        1,10s/how/HOW/g

      查找替换中的分隔符/可替换为其它字符,例如

        s@@@ ,s###

      查找替换举例如下:

[zhangshuo@localhost ~]$ #1、复制/etc/grub2.cfg至/tmp/下,用查找替换命令删除/tmp/grub2.cfg文件中的行首的空白字符
[zhangshuo@localhost ~]$ :%s/^[[:space:]]\+//g
[zhangshuo@localhost ~]$ #2、复制/etc/rc.d/init.d/functions文件至/tpm目录,用查找替换命令为/tmp/functions的每 行开头为空白字符的行首添加一个#号
[zhangshuo@localhost ~]$ :%s/^[[:space:]]\+/#&/g

vim编辑器和bash条件测试

vim的多文件模式

  vim打开多个文件方式

    vim FILE1 FILE2 FILE3:使用vim同时打开多个文件可以在这多个文件之间进行复制粘贴等操作

      :next下一个 :prev上一个 :first第一个 :last最后一个

      :wall保存所有 :qall退处所有 :wqall保存退出所有

  窗口分割模式

    vim -o|O FILE1 FILE2

      -o:水平分割

      -O:垂直分割

      在窗口间切换:Ctrl+w,ARROW

  单文件窗口分割

    Ctrl+w,s:水平分割窗口

    Ctrl+w,v:垂直分割窗口

  定制vim的工作特性

    配置文件:永久有效

      全局配置:/etc/vimrc

      个人配置:~/.vimrc该文件通常不存在需要自己手动建立

    末行模式下配置:对当前vim有效

    配置命令:

      (1)、显示行号:set number,set nu

        取消显示行号:set nonumber,set nonu

      (2)、括号匹配高亮显示:set showmatch,set sm

        取消括号匹配高亮显示:set nosm

      (3)、自动缩进:set ai,取消自动缩进:set noai

      (4)、高亮搜索:set hlsearch,取消高亮搜索:set nohlsearch

      (5)、忽略字符的大小写:set ic,取消:set noic

  vim应用举例:

[zhangshuo@localhost ~]$ #1、复制/etc/rc.d/functions 文件至/tmp目录,替换/tmp/functions文件中的/etc/sysconfig/init为/var/log
[zhangshuo@localhost ~]$ vim /tmp/functions
:%s@/etc/sysconfig/init@/var/log@g
[zhangshuo@localhost ~]$ #2、删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号
[zhangshuo@localhost ~]$ vim /tmp/functions
:%s/^#\([[:space:]]\+\)/\1/g

bash条件测试

  测试方法:

    test EXPRESSION

    [ EXPRESSION ]

    [[ EXPRESSION ]]

  测试表达式的类别:

    数值比较:(上面提到过了)

    字符串比较:(上面提到过了)

    文件测试:

      存在性测试:

        -a FILE:

        -e FILE:文件存在性测试,存在为真,否则为假

      存在及类别测试:

        -b FILE:被测文件是否存在且为块设备文件

        -c FILE:被测文件是否存在且为字符设备文件

        -d FILE:被测文件是否存在且为目录文件

        -f FILE:被测文件是否存在且为普通文件

        -h FILE 或 -L FILE :被测文件是否存在且为符号链接文件

        -p FILE:被测文件是否存在且为管道文件

        -S FILE:被测文件是否存在且为套接字文件

      文件特殊权限测试:

        -g FILE:被测文件是否存在且拥有sgid权限

        -u FILE:被测文件是否存在且拥有suid权限

        -k FILE:被测文件是否存在且拥有sticky权限

      文件权限测试:

        -r FILE:被测文件是否拥有读权限

        -w FILE:被测文件是否拥有写权限

        -x FILE:被测文件是否拥有可执行权限

      文件大小测试:

        -s FILE:被测文件是否存在且非空

      文件是否打开:

        -t fd:fd表示文件描述符是否已经打开且与某终端相关

        -N FILE:文件自从上一次被读取之后是否被修改过

        -O FILE:当前有效用户是否为该文件的属主

        -G FILE:当前有效用户是否为改文件的属组

      双目测试:

        FILE1 -ef FILE2:FILE1与FILE2是否指向同一个设备上的相同的inode

        FILE1 -nt FILE2:FILE1是否新与FILE2

        FILE1 -ot FILE2:FILE1是否旧与FILE2

  组合测试条件:

  是基于逻辑运算来实现的

  两种方式:

    第一种方式:

      COMMAND1 && COMMAND2

      COMMAND2 || COMMAND2

      !COMMAND

      比如:

        [ -e FILE ] && [ -r FILE]

    第二种方式:

      &&:EXPRESSION1 -a EXPRESSION2

      ||:EXPRESSION1 -o EXPRESSION2

      !EXPRESSION

      注意这种方式必须使用测试命令进行

      比如:

        [ -z “$hostName” ] || [ “$hostName”==”localhost.localdomain” ]也可以用第二种方式:

        [ -z “$hostName” -o “$hostName”==”localhost.localdomain” ]

        [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

-EOF

文章目录
  1. 1.
  2. 2. egrep及bash中的变量
    1. 2.1. egrep及扩展的正则表达式
    2. 2.2. bash的基础特性(4)
  3. 3. bash环境配置及脚本
    1. 3.1. bansh环境配置
    2. 3.2. bash中的算数运算符
    3. 3.3. bash中的条件测试
  4. 4. vim编辑器
  5. 5. vim编辑器和bash条件测试
    1. 5.1. vim的多文件模式
    2. 5.2. bash条件测试
, , 本站文章总字数: 40.5k