正则表达式是一个通用且非常好用的工具,它值得我们花费一点时间去学习它的原理。我们先从我们刚刚使用到的命令/.*Disconnected from /开始。
正则表达式通常被/包裹,大多数ASCII字符代表它们原本的含义,但也有一些特殊字符拥有特殊的含义。正因此,在不同的表达式中,同样的字符可能表示不同的含义,这也是很多人被劝退的原因。常用的匹配模式有:
.表示匹配任意单个字符
*匹配0个或任意多个它之前的字符
+匹配一个或多个它之前的字符
[abc]匹配括号内的任一字符,a或b或c
(RX1 | RX2)表示匹配RX1或RX2
^匹配一行开头
$匹配一行结束
sed使用的正则表达式有一些奇怪,它需要在特殊符号之前加上\,或者你可以传入参数-E。我们回顾一下刚刚用到的/.*Disconnected from /,我们可以看到它在开头匹配任何文本,接着匹配Disconnected from这也是我们希望的。
但有的时候,正则表达式会有trick,如果我们拿到的日志里的用户名叫做Disconnected from会怎样?我们将会获得:
Jan 17 03:13:00 thesquareplanet.com sshd[2631]: Disconnected from invalid user Disconnected from 46.97.239.16 port 55920 [preauth]我们最终将会得到什么结果?
由于*, +在默认情况下是贪婪匹配的,即它们会尽可能多地匹配文本。因此在上面的例子当中,我们将会得到这样的结果:
所以正则表达式并不是一个简单的事情,关于它有非常多的讨论。人们写了很多测试样例,你甚至可以通过正则表达式来判断一个数是否是质数。
正则表达式是出了名的难搞,但把它放进你的工具箱,也能帮到你很多。这一段如果看不懂可以去看下视频,老师在课上讲得很好,因为有演示所以很容易理解,只看文章会比较困难。 Back to data wrangling
for i in {a..z};
do for j in {a..z};
do echo ${i}${j}
done
done
./enum.sh > all.txt
最后,我们用diff命令查看一下两个文件的差别,再统计行数:
diff --unchanged-group-format='' occur.txt all.txt | wc -l