数据的处理

来源:互联网 发布:java 自行车 编辑:程序博客网 时间:2024/06/11 00:35

在使用Linux的时候,我们可能需要对一些命令所输出的数据进行处理,最终得到我们想要的数据。下面我们就来学习一下跟数据处理相关的命令。

管道命令 (pipe)

管道命令使用的是“ | ” 这个符号来表示,下面先使用一个栗子来讲解这个命令。

栗子:假设想查看~/PipeComand 这个文件中是否存在“pipe2”这个字符串。

这里写图片描述

使用cat PipeCommand产生的standard output 经过“ | ”处理,作为grep 'pipe2'的standard input(下节将讲解grep命令)。注意! “ | ”不会处理standard error output。下面在用图解释一下“ | ”命令。

这里写图片描述

“ | ”后面只能是命令,而且这个命令必须能接收standard input, 这样的命令才是管道命令。例如 less,more等等,而ls,cp,mv 不能接收standard input,所以就不是管道命令。

筛选数据:cut,grep

  • cut
    这个命令是以“一段”数据为单位进行处理的命令,下面先介绍这个命令常用的参数。

    • -d : 后面写你要想分割的字符(只能使用一个字符作为分割符),与 -f 一起使用。

    • -f : 使用-d 将一段数据分成若干段之后,在根据 -f 选取出那几段。

    • -c : 以位置进行分割。

    • –color=auto :将匹配到的字符加上高亮。

    下面做些栗子来演示

    栗子一

    这里写图片描述
    这里使用一个空格' '为分割符,将CutCommand文件的一段数据分为4段, -f 2表示选取第而段。还可以使用2,3来选取第二段和第三段。

first second third fifth  1  |   2  |  3  |  4 

栗子二
这里写图片描述

-c 1就是输出第一个字符。 也可以使用-c 1-10输出第1个到第10个字符。

  • grep
    这个命令则是对“一行”进行操作。下面是这个命令的一些常用到的参数。

    • -c : 计算 '想要查找的字符'出现的次数。

    • -i : 查找的时候忽略大小写。

    • n : 输出行号。

    • v : 逆向操作,即查找不符合 '想要查找的字符' 的数据。

    下面做些栗子来演示

    栗子一

    这里写图片描述
    ll中的有Grep的行输出。这个命令支持模糊查询。

    栗子二
    这里写图片描述
    与栗子一相反,将ll 中没有Grep的行输出。

    栗子三
    这里写图片描述
    在使用grep命令查除文件详细的信息后,在使用cut命令截取出文件名。

排序命令: sort, uniq, wc

  • sort
    这是一个以‘列’来排序的命令,可以根据数字,字母,月份等进行排序(默认是以字母排序)。下面是这个命令常用的一些参数

    • -f : 忽略大小写。

    • M : 以月份进行排序。

    • n : 以数字从小到大排序。

    • u : 如果有相同的数据,但只显示一条。

    • t : 以[tab]键分割。

    • k : 以那个区间进行排序。

    下面做些栗子来演示

    栗子一
    这里写图片描述
    这里需要注意的是,sort是以列排序的,所有66只有第一个6参与到排序中。

栗子二
这里写图片描述
这里以空格分割' ',并选择第二列进行排序。

  • uniq
    这个命令根据行来去除重复的数据。下面是这个命令常用的参数。

    • -i : 忽略字母大小。

    • -c :计算有多少条重复的数据。

    下面做些栗子来演示

    栗子一
    这里写图片描述
    计算有多少条重复的数据。

  • wc
    这个命令是计算文件里面有多少行,多少字,多少字符(默认是全部显示)。下面是这个命令常用的参数。

    • l : 只显示有多少行。

    • w : 只显示有多少个字(英文字母)。

    • m : 多少个字符。

    这个命令很简单就不再演示了。

双向重定向 :tee

是用> 可以将数据流传送给设备或者一个文件,但如果我们想继续使用这个数据流该怎么办。这是哟时候就可以是用tee这个命令。

这里写图片描述

这里先将ll产生的数据输出流使用tee ll导入到ll文件中,但此时这个流还会往下流动,当作grep -v 'total'的数据输入流。

字符串转换与合并:tr,paste

  • tr
    这个命令可以用于删除数据中的文字,或者转换字母大小写等等功能。下面是这个命令常用的一些参数。

    • -d : 删除指定的字符串。

    • -s : 替换指定的字符。

    下面做些栗子来演示

    栗子一
    这里写图片描述
    这里将ll命令所输出的数据中所有的小写字母转换成大写字母。此命令可以使用正则表达式。

    栗子二
    这里写图片描述

这里将ll命令所输出的数据中的空格删除。

  • paste
    此命令可以将两个文件的内容合并。下面是这个命令常用的一些参数。

    • -d : 后面接分隔符,默认是以[tab]分割。

    • - :这个符号表示来自standard input。可以代替文件。

    下面做些栗子来演示

    栗子一
    这里写图片描述
    这里将ls命令所输出的数据与PasteCommand文件合并在一起。中间以?隔开(如果有多个特殊字符,只会以第一个字符分割), 这里的 - 是表示ls所产生的standard output。

命令是否执行的依据

在许多的编程语言中,逻辑表达式往往是不可或缺的一部分。在Linux中也存在着相关的命令可以达到逻辑表达式的效果。下面我们就来一起学习这部分的知识。

  • 一次回车执行多条命令的操作
    在两个命令中使用“;”可以使这两个命令连续执行。例如下面这样:
    这里写图片描述
    这里使用mkdir test先创建test目录,然后将工作目录切换到前一命令创建的目录中。但是这段命令可能会报错,因为如果test目录已经存在的话,则会报错。也就是说,现在这两个命令存在关联性。那么此时我们就可以使用Linux中的逻辑符号来解决这个问题。

  • 逻辑符号:&&,ll

    在Linux中,每一个命令的执行之后,都会有一个回传码。如果命令执行成功,则会回传一个数字0作为成功执行的标识,如果失败,则是1。值最后会被存储在$?这个变量中。现在我们已经知道命是否令已经执行成功了,下面是该两个逻辑符号的说明:

    • &&

      • cmd1 && cmd2 :若cmd1执行后,回传码为0,则开始执行cmd2; 若cmd1执行后,回创码为1,则comd2不执行。
    • ||

      • cmd1 || cmd2: 若cmd1执行后,回传码为0,则cmd2不执行;若cmd1执行后,回传码为1,则开始执行cmd2。
  • 栗子

    • 栗子1 : 判断是否有~/LogicCommandFolder目录。如果有则将工作目录切换到该目录下面,并在该目录下创建文件名为LogicCommandFIle的文件。没有则什么都不做。
      这里写图片描述
      这里只以~/LogicCommandFolder目录存在为例子,所有先创建该文件。由于有该目录,所有表达式1的回传码为0,并且已经将工作目录切换到该目录,然后再在该目录下创建LogicCommandFIle文件。

    • 栗子2 : 根据~/目录下是否有LogicCommand文件,如果有则不进行任何操作,没有就创建该文件(但是控制会有错误信息)。
      这里写图片描述
      这是没有LogicCommand文件的情况下执行之后的效果,可以看到cat ~/LogicCommand执行的时候,由于没有LogicCommand文件所有控制台报出了一段错误信息,并且回传码是1。所以
      开始执行touch ~/LogicCommand

    • 栗子 : 不管有没有~/tmp/chestnut/目录存不存在,都在该目录下创建文件名为anyway的文件。
      这里写图片描述
      这个条命令会有两条执行路线:

      1. 如果/tmp/chestnut/目录不存在,则回传码是1,所以开始执行mkdir /tmp/chestnut命令创建该目录,因为这段命令会成功执行,所以回传码为0,后面执行touch /tmp/chestnut/anyway命令来创建anyway文件。

      2. 如果/tmp/chestnut/目录存在,则回传码是0,而||遇到回传码为0所以不执行mkdir /tmp/chestnut,接下来,回传码0会继续往右传递,因为右边是&&,所以执行touch /tmp/chestnut/anyway命令来创建anyway文件。

数据流重定向是什么

一般来说,我们使用命令行来操作Linux,那这跟数据流重定向又有什么关系呢?举个栗子,假设你需要将一个命令所输出的信息存储到一个文件里面该怎么办?,那么数据流重定向就能解决这个问题。一般来说你执行一个命令通常它会是下面这张图所示的,

当我们执行一个命令时,这个命令可能会先从文件读取数据,经过处理之后,再将数据输出到屏幕上。输出可以分为标准输出(standard output)和标准错误输出(standard error output)。

  • 标准输出与标准错误输出

标准输出指的是命令是指命令执行成功所传回来的正确信息,而标准错误输出则是命令执行失败之后所传回来的信息。比如,我使用这个cat命令来展示文件信息,如果被展示的文件存在,则会将文件的内容输出到屏幕上,而这就是标准输出。如果被展示的文件不存在,则会将错误信息输出到屏幕上,而这就是标准错误输出。如果我们想把正确的信息和错误的信息分开存储到不同的文件中,则可以使用下面这些特殊字符:

  1. 标准输出(stdout) : 代码为1,使用>或>>。
  2. 标准错误输出(stderr): 代码为2,使用2>或2>>。

下面是具体的用法:

这里写图片描述

ls .命令输出的信息通过>(也可以写成1>)存储到dataflow这个文件中,如果dataflow文件存在,则会创建这个文件,并把ls .命令的输出的信息存储到这个文件中(如果此文件已经有内容则会被覆盖),所有的数据流操作都是如此。如果不想文件内容被覆盖则可以使用下面这个命令。

这里写图片描述

是里使用>>(也可以写成1>>)将echo $PATH 输出的信息累加到dataflow 文件中。下面是标准错误输出的用法。

这里写图片描述

使用2>则可以将错误的信息存储到指定的文件中。如果不想指定文件的内容不被覆盖则可以使用2>>,把错误信息和正确信息存储到一个文件中可以使用&>。这里就不在多做演示。如果想将正确的信息和错误的信息分别存储不同的文件中则可以使用下面这个用法。

这里写图片描述

find /home -name .bashrc 命令会查找/home 目录是否有.bashrc文件的存在。因为该命令会检查所有指定目录下的文件,而这些文件不一定有足够的权限可以访问,所以可能会引发权限不足的错误信息。在这个用法中,使用>将正确的信息存储到RightInfo中,把错误的信息存储到ErrorInfo中。

/dev/null信息垃圾桶设备
这个设备的用处是用是,如果你不想错误信息输出到屏幕上,并且也不存储到文件中,就可以将信息输出到这个设备中。这个设备会将错误信息吃掉。下面是用法:

这里写图片描述

参考

《鸟哥的Linux私房菜》


如此文章有不对地方请多多指正!

原创粉丝点击