本节会介绍如何将数据的一种格式转换到另一种格式,也就是对数据的整理。

目录如下:

我们可以使用journalctl来查询系统的日志,然后使用grep将想要得到的信息进行过滤:

1
carol@ubuntu-carol:~/learnShell$ journalctl | grep -i intel

你会看到控制台会一次性显示很多与intel相关的日志信息,为了便于查看,可以使用less命令进行翻页。

1
carol@ubuntu-carol:~/learnShell$ journalctl | grep -i intel | less

当然,这里会介绍一个强大的“流编辑器”工具sed,我们可以使用一些简短的命令(例如正则表达式)来修改文件,而不是直接操作文件的内容。

比较常用的是s,也就是进行替换命令。它的格式为s/REGEX/SUBSTITITION,其中,REGEX需要使用正则表达式,而SUBSTITITION是用于替换匹配结果的文本。例如:

1
carol@ubuntu-carol:~/learnShell$ cat ssh.log | sed 's/.*intel //'

这里的/.*intel /表示可以匹配任何以若干任意字符开头,并且包含intel的字符串。常见的正则表达式如下:

  • .:除了空格之外的任意单个字符。
  • *:匹配前面字符零次或多次。
  • +:匹配前面字符一次或多次。
  • [abc]:匹配 a、b、c 中的任意一个。
  • (RX1 | RX2):任何能够匹配RX1RX2的结果。
  • ^:行首。
  • &:行尾。

这里对[abc]的使用给出一个实例。

1
2
3
4
5
carol@ubuntu-carol:~/learnShell$ echo 'aba' | sed 's/[ab]//'
ba
carol@ubuntu-carol:~/learnShell$ echo 'bba' | sed 's/[ab]//'
ba
carol@ubuntu-carol:~/learnShell$ 

正如你所看到的,对于字符串aba来说,当遇到s/[ab]//时,会将首个a替换为空。而对于字符串bba来说,当遇到s/[ab]//时,会将首个b替换为空。

你也可以使用g来过滤出不在[ab]中的字符,如下:

1
2
3
4
5
6
7
carol@ubuntu-carol:~/learnShell$ echo 'abac' | sed 's/[ab]//g'
c
carol@ubuntu-carol:~/learnShell$ echo 'abzzcczac' | sed 's/[ab]//g'
zzcczc
carol@ubuntu-carol:~/learnShell$ echo 'abzzccabszac' | sed 's/[ab]//g'
zzccszc
carol@ubuntu-carol:~/learnShell$ 

还可以进行一些其它的应用,如下:

1
2
3
4
5
6
7
carol@ubuntu-carol:~/learnShell$ echo 'abcabc' | sed -E 's/(ab)*//g'
cc
carol@ubuntu-carol:~/learnShell$ echo 'abcabc' | sed -E 's/(ab|bc)*//g'
cc
carol@ubuntu-carol:~/learnShell$ echo 'abcabbc' | sed -E 's/(ab|bc)*//g'
c
carol@ubuntu-carol:~/learnShell$ 

通篇看下来,文章主要介绍了sedawk的使用,并结合正则表达式来进行一些数据整理的操作。对于正则表达式来说,可以使用在线调试工具 Regex101 来帮助你更好的理解它的使用。

此外,文章最后还给出了匹配电子邮箱的正则表达式、判断一个数是否为质数的正则表达式。