当我们试图在输出很多的地方(系统日志,长文本)中找到自己需要的东西的时候,我们就需要进行数据的整理

在之前的学习中,我们就已经接触过一些数据整理的基本技术.比如当我们使用 | 管道运算符向 grep 发送东西的时候,实际上就是一种数据整理,例如 history | grep "grep" 就是在我输入过的命令中寻找 grep

如何进行数据整理

在linux里进行数据整理最核心的就是grep类的命令

例如当我们试图在系统日志中找到 imicola 使用 root 用命令做过多少坏事,那么我们就可以用

$ journalctl | grep imicola

来获取日志中所有含有 imicola 的条目,但是我们很快便会发现,这个玩意输出的东西也是杂乱无章

我们就可以进一步使用

$ journalctl | grep imicola | grep root

来细分提取出来的 imicola 里的有root的情况

在整理数据的时候,这种对数据流的细分整理就是一种数据整理的方法,我们去除冗杂的信息只提取我们需要的信息

有时候为了我们更好的阅读,我们可以在数据整理后通过管道命令传入给less命令

  • less命令会创建一个分页器,这个分页器可以支持我们翻页浏览.具体的操作在命令介绍页有讲述

有的时候,为了我们更好的进行数据整理,我们还可以把输出的数据使用 > .log 保存下来,使用 vim 或其他工具编辑整理分类

数据剔除与编辑

有的时候我们筛选出数据之后还会有很多数据冗杂,这时候我们可以使用 sed 工具来对文本进行编辑

点这里 sed命令详情

但是使用sed命令难免会出现一个问题:正则表达式怎么写? 所以就需要我们学习 正则表达式


数据排序

使用 sort 来对数据进行排序,其排序策略一般是字典序,使用sort -n可以按照数字出现的顺序进行排序,同时 uniq -c 会把连续出现的行折叠为一行并且使用出现次数作为前缀

关于 sort 也有很多扩展的用法,会在单独页详细介绍


数据的排版

与整理对应的是数据的排版,好的数据排版能给人直观易懂的效果,在这里我们需要引入两个命令 pasteawk(这一章命令怎么这么多?)

paste 是一种用于合并文件行或流输出行的,他可以将多个文件中的对应行拼接在一起,默认使用制表符分割

  • 使用管道输出时候需要使用 - 参数 即 ls | paste -

awk 严格而言,是一种编程语言,只不过其特别擅长处理文本,我们今天在这里只浅浅了解一下基本用法

例如,当我们输入 awk '{print $2}' 的时候,会将每行的第二个基于awk的分隔符(默认是空格)的区域打印出来,简单而言,就是会将每行第二个单词打印出来,这就表示在我们输入 awk '{print $n}' 的时候会将一行中的第 n 个数据筛选出来

同时 awk 也接受正则表达式和一些操作

| awk '$1 == 1 && $2 ~ /^c[^ ]*e$/ { print $2 }' | wc -l

这个指令可以列出开头为c,结尾为e的在输入中只出现过一次(需要搭配前面的去重排序)的单词

同时 awk 作为一个编程语言,我们也可以写编程语句与脚本来匹配文本

BEGIN { rows = 0 }
$1 == 1 && $2 ~ /^c[^ ]*e$/ {rows += 1}
END { print rows }

BEGIN 也是一种模式,它会匹配输入的开头( END 则匹配结尾)。然后,对每一行第一个部分进行累加,最后将结果输出