MIT Missing Semester笔记(三)
2023-03-23  学习

数据整理

一些重要网址

在线正则表达式调试工具regex debugger

正则表达式教程


第四节课:数据整理,日志处理是典型的场景,比如journalctl | grep -i intel

ssh myserver 'journalctl | grep sshd | grep "Disconnected from"' | less

将处理过程更多地放在服务器上,减少网络传输,less创建一个分页器

sed 是一个基于文本编辑器ed构建的”流编辑器” ,如:

ssh myserver journalctl
 | grep sshd
 | grep "Disconnected from"
 | sed 's/.*Disconnected from //'

s/REGEX/SUBSTITUTION/,其中regex为正则表达式,现查现用吧

  • . 除换行符之外的”任意单个字符”
  • * 匹配前面字符零次或多次
  • + 匹配前面字符一次或多次
  • [abc] 匹配 a, bc 中的任意一个
  • (RX1|RX2) 任何能够匹配RX1RX2的结果
  • ^ 行首
  • $ 行尾

*+默认是贪心的,sed不支持在它们后面增加?

# Jan 17 03:13:00 thesquareplanet.com sshd[2631]: Disconnected from
# invalid user Disconnected from 46.97.239.16 port 55920 [preauth]
# /.*Disconnected from /会匹配出
# 46.97.239.16 port 55920 [preauth]
perl -pe 's/.*?Disconnected from //'
# 可以只匹配到第一个

使用捕获组(capture groups)填充SUBSTITUTION部分,每个圆括号对应\1\2\3

| sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/'

比较完整的处理

ssh myserver journalctl
 | grep sshd
 | grep "Disconnected from"
 | sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/'
 | sort | uniq -c
 | sort -nk1,1 | tail -n10
 | awk '{print $2}' | paste -sd,

uniq -c 会把连续出现的行折叠为一行并使用出现次数作为前缀, paste命令来合并行(-s),并指定一个分隔符进行分割 (-d)。

对于awk$0 表示整行的内容,$1$n 为一行中的 n 个区域,区域的分割基于 awk 的域分隔符(默认是空格,可以通过-F来修改)。

# 统计所有以c开头,以e结尾,并且仅尝试过一次登录的用户
 | awk '$1 == 1 && $2 ~ /^c[^ ]*e$/ { print $2 }' | wc -l
 # wc为word count

xargs

命令可以从标准输入和参数中读取所处理的内容,管道控制的是标准输入输出,一些命令如killrm只能读取参数,需要使用xargs将标准输出变为参数,参考了一篇知乎专栏

具体用法可参考这篇https://www.cnblogs.com/chenxiaomeng/p/16040498.html

课后习题

参考答案

wsl并不是通过systemd进程启动的,在wsl中开启systemd参考这个