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
,b
和c
中的任意一个(RX1|RX2)
任何能够匹配RX1
或RX2
的结果^
行首$
行尾
*
和+
默认是贪心的,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
命令可以从标准输入和参数中读取所处理的内容,管道控制的是标准输入输出,一些命令如kill
、rm
只能读取参数,需要使用xargs将标准输出变为参数,参考了一篇知乎专栏
具体用法可参考这篇https://www.cnblogs.com/chenxiaomeng/p/16040498.html
课后习题
wsl并不是通过systemd进程启动的,在wsl中开启systemd参考这个