shell脚本--文本处理以及编程原理

一、文本处理工具

wc命令

wc(Word count)用于统计文本文件中的字符个数

 

15是行数  78是字符个数   805是文件大小(字节)【1字节等于8比特】

2、参数:-l(统计行数)、-w(统计单词数)、-c(统计字节数)

 

cut(切片)命令

1、指定分隔符,切割文件

2、常见参数:-d(指定分割符)、-f(指定提取哪一列)、--output-delimiter=‘’(将输出的分隔符,替换为自己想用的分隔符)

示例:cut -d” ” -f1 /etc/fstab(取第一列)

    cut -d” ” -f1,3 /etc/fstab(取第1、3列)

    cut -d” ” -f1-3 /etc/fstab(取第1到3列)

    cut -d[:] -f1d /etc/fstab(指定分隔符为空格和冒号)([ ]代表括号里的 任意字符都匹配)

3、cut无法指定多个分隔符,awk可以指定多个分隔符

 【cut的局限性:1、-d指定分隔符,不能同时指定多个  2、不能做高级的格式化输出;所以要掌握awk命令】

sort命令

1、sort命令根据ASCII码来进行排序,并不是数值大小

2、常用参数:-r(逆序)、-f(忽略字符的大小写)

         -t(指定字段分隔符)、-n(以数值大小排序)

         -u(排序去除重复,重复的不显示)

       -k(指定哪一列进行排序)

uniq命令

1、uniq命令用于去重,但是只有连续且相同的命令才被视为重复【所以要先排序在去重】

2、常用参数:-c(统计某些字符重复的字数)【例:sort filename | uniq -c】

                -d(仅仅显示未重复过的行)

练习:取出/etc/passwd文件的第6到10行,并将这些信息按照第3个字段的数值大小进行排序,最后仅显示各自的第一个字段

           Head /etc/passwd | tail -5 | sort -t: -k3 -n |cut -d” “ -f1

 二、编程原理

1、机械码(16进制)的局限性:识别机器,各种品牌不兼容

2、机器只能识别二进制指令

3、程序=指令+数据

4、驱动硬件设备默认不能使用;CPU控制硬件资源,CPU由控制器与运算器组成

5、驱动程序:不同的厂家的硬件设备之间需要进行指令沟通时,我们需要驱动程序来进行“翻译”

6、更接近于硬件开发的工程师要学习“汇编语言”,但是汇编语言被厂家所限制

7、C语言与C++的底层为汇编语言

8、操作系统用来分配硬件资源(操作系统用C语言来写)

9、现在的编程基于高级语言及超高级语言,更好的让程序员能够实现编程功能。高级语言及超高级语言需要翻译成计算机可读的语言(二进制语言),翻译分为两种:解释型(逐行翻译,逐行执行,      例:bash -x filename(方便排错))与编译型(一次编译,全部执行)

10、Shell,Python为解释型语言,编译安装大多使用C语言、C++、C#

11、编程语言的分类:根据服务的重心不同,编程分为面向对象编程(侧重于数据的语言)和面向过程编程(侧重于指令的语言)。

12、编程语言的执行方式【一行一行】:顺序执行(没有逻辑关系)、循环执行(for(遍历,常用)、While(循环条件,True的时候开始循环)、unti(与while相反,False的时候开始循环))、选择    执行(分支if语句、case(重点使用))

13、Shell编程介绍:shell语句是面向过程的,侧重于指令集;

          shell语句的基本结构组成:命令、数据-变量、逻辑关系

          shell没有内嵌函数,没有函数库调用

            没调用的接口,这一点限制了shell脚本的功能,不像Python,可以调用各种模块接口

            优点:shell的功能更好的兼容系统,可以直接调用系统命令,执行效率更高

14、shell脚本的第一句话必须写(#!/bin/bash)---->定义脚本解释器

15、/etc/shells----------查看当前系统支持的shell程序 

      echo $SHELL-----查看当前会话的shell程序  

      /etc/passwd----------制定了用户默认支持的shell程序(/bin/nologin) 

16、shell的执行:1、bash命令来执行脚本

              参数:-n  查看shell脚本的逻辑错误

                                  -x  逐行显示执行的脚本程序(方便排错)

                            2、授权 chmod +x filename,然后使用全路径执行脚本

17、变量:环境变量

        局部变量(declare 命令--定义变量类型)

        本地变量(local在函数中使用)

18、变量类型:数值型(浮点型(float),整型(int),布尔值(bollean,0、1    及false、true))

                字符串:(普通字符及字符串、数组)

19、编程语言的分类:根据变量的不同,分为强类型语言(数值必须被定义,才能进行处理或运算)和弱类型语言(编程语言可以自动识别变量类型)

20、多态:一个数据有多个属性,而最后使用的属性取决于和它进行运算的数据

21、传参:$?(上一条命令的执行状态,0代表正确,1-255表示错误)

        $1、$2、${10}--------命令后面传入脚本的数据,以空格为分隔符

      $#(统计传参数量,${$#}统计传参量)

      $*(表示所有传参,所有的传参以字符串形式输出)

        $@(表示所有传参,所有的传参以列表形式输出)

                 

22、定义变量格式:NAME=VALUE(中间不要有空格,一个等号是赋值,两个等号是判断)

         通过命令declare定义变量参数(例:declare -i a=10 int() str())

          declare -a(代表数组)、declare -i (代表整数)

23、变量命名:下划线的方式指定变量名称

          驼峰命名方式

24、文件测试、条件判断:在脚本语言中,我们需要进行语句分支,就是要做判断,判断就是使用test命令来实现的。

使用格式:test [option] file

                   [  条件语句 ]

【不用test做判断时不加[  ]】

常见的test选项:

比较选项:-eq(等于)、-en(不等于)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)【用于数值的判断,字符用=、!=】

判断选项:-f(判断是否为普通文件)、-d(判断是否为目录件)、-L(判断是否为链接文件)、-r、-w、-x(判断是否具有读 写 执行的权限))

关联选项:-o(或)、-a(与)、!(非)

字符串测试:=(等于为真)、!=(不等于为假)、-z(判断字符串是否存在,存在为真,不存在为假)、-n(与-z相反)

25、逻辑运算:与 && :两边的命令都为真时结果才为真

          或 || :两边的命令,一边为真就是真,同时为假才是假

        非 !

        [ $? -eq 0 ]  && exit 0 || exit 1

前后对接的都是单独的存在的命令,前后的两个命令没有任何关系只是通过逻辑运算符联系在一起

26、算数运算:let(1+1)    例:let a=1+1  echo $a 

               expr(1*1)   例:exor 1* 10

          $[]   [$1+10]   例:a=$[2+3]   echo $a   

       $(())   (($1/$2))      例:a=$((2/4))   echo $a

 27、编程练习

输出100以内的书的和

1
2
3
4
5
6
7
8
#!/bin/bash
 
declare -i i=0
declare -i sum=0
while [ $i -le 100 ] ;do
        sum+=$i
        let i=i+1
done

执行结果:

 

传参

1
2
3
4
5
6
7
#!/bin/bash
echo "$1 $2 ...${10}"
echo $?
echo $#
echo $*
echo $@
echo ${$#} 

执行结果:

 

判断文件是否存在

1
2
3
4
5
6
7
8
#!/bin/bash
#判断文件是否存在
 
if [ -f $1 -a -w $1 ];then
        echo "$1 文件不存在"
else
        echo "$1 文件已存在"
fi

 

判断用户类型

 

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#判断用户类型
 
declare -i uid=`uid -u $1`
 
if [ $uid -eq 0 ];then
        echo "这个是管理员"
else
        echo "这是个普通用户"
fi

 

执行结果:

posted @ 2019-08-28 10:12  Eucalyptusleaves  阅读(397)  评论(0编辑  收藏  举报