写在前面:本文内容来自麻省理工学院开设的课程:计算机教育中缺失的一课。本课程介绍了命令行,强大的文本编辑器的使用,以及版本控制系统提供的各种特性的使用等等。中文课程主页:https://missing-semester-cn.github.io/本文是课程的第四部分,主题是数据组织。在大多数情况下,数据整理要求您能够确定可以使用哪些工具来实现数据整理的特定目的,并了解如何组合使用这些工具。获取服务器日志:sshmyserverjournalct>journalsed:使用正则表达式替换,usage,sed's/.*Disconnectedfrom//',将这部分替换为空。s/REGEX/SUBSTITUTION/capture组,如果想保留表达式中的部分匹配信息,可以在SUBSTITUTION中使用\1、\2来表示捕获信息正则表达式的一些用法。除了空格"任意单个字符"(这样正确吗,没有空格?)*匹配前一个字符零次或多次+匹配前一个字符一次或多次[abc]匹配a、b、c中的任意一个(RX1|RX2)任何能匹配RX1或RX2的结果^行首$行尾正则表达式默认是贪心的,可以加上?*或+后改为非贪婪模式,测试正则表达式是否正确:debug匹配任意单词([^]??+会匹配任意不为空且不包含空格的序列)其中,如果放^在表达式的开头,表示从行首开始匹配;否则,它意味着“不包括”对输入数据进行排序:sortsort-n将按数字对输入进行排序(默认情况下按字典顺序-k1,1表示“仅基于由空格分隔的第一列进行排序”。,n部分表示“只排序到第n个部分”,默认是到行尾。sort-r可以将连续的行倒序折叠成一行,并以出现的次数作为前缀:uniq-csshmyserverjournalctl#readlog|grepsshd|grep“断开连接”|sed-E's/.*Disconnectedfrom(invalid|authenticating)?user(.*)[^]+port[0-9]+(\[preauth\])?$/\2/'#获取用户名|排序|uniq-c#对用户名进行排序并合并|排序-nk1,1|尾-n10|awk'{print$2}'|paste-sd,#合并行,使用,分开awk:是一种编程语言,非常擅长处理文本$0表示整行的内容,$1到$n是一行中的n个区域,区域的划分是基于awk的字段分隔符(默认为空格,可通过-F修改)。所有以c开头以e结尾且仅尝试登录一次的用户。|awk'$1==1&&$2~/^c[^]*e$/{print$2}'|wc-l这个匹配要求文本的第一部分需要等于1(这部分刚好是uniq-cvalue得到的count)第二部分必须满足给定的正则表达式BEGIN{rows=0}$1==1&&$2~/^c[^]*e$/{rows+=$1}END{printrows}命令行计算器,bcbc-l使用计算库,包括正弦和余弦交互式正则表达式教程。-\d匹配数字,\D匹配非数字字符-。匹配任何字符\。匹配句号-匹配特定字符,[abc],可匹配a或b或c-去除特定字符,[^abc],可匹配除a、b或c以外的任何字符-表示字符,\w效果=[A-za-z0-9_],\W,不是这些字符-捕获出现一定次数的字符-a{3},出现3次-a{1,3},出现不少于1次,不多于3次-*匹配出现任意次数,+匹配至少出现一次-?match是可选的,可能不会出现或出现一次——各种空格的处理:\s可以匹配空格包括空格、制表符(\t)、换行符(\n)和回车符(\r),非常有用。\S匹配非空格字符-^匹配句首-$匹配句尾-捕获组-正则表达式可用于提取信息进一步处理-用()括起来对得到??的结果进行分组-嵌入集合:多个括号嵌套-条件表达式,组合()和|-reference(backreference)-\0完整的匹配文本-\1第一组-\2第二组统计单词文件(/usr/share/dict/words)至少包含三个a且不以结尾的单词数的。这些单词中出现频率最高的前三个单词的最后两个字母是什么?sed的y命令,或者tr程序可以帮你解决大小写问题。存在多少个结尾的两个字母组合?还有一个很有挑战性的问题:哪个组合没有出现过?(这里使用捕获组是更好的解决方案:.*(..),其中\1可以捕获最后两个字母)#统计字数cat/usr/share/dict/words|rg"\w*a\w*a\w*a\w*[^'s]"|tr"[:upper:]""[:lower:]"|uniq-c|wc-l#5345#!/bin/bashwords="./words.txt"cat/usr/share/dict/words|rg"\w*a\w*a\w*a\w*[^'s]"|tr"[:upper:]""[:lower:]">words.txtrun(){foriin{a..z};在{a..z}中为j做;做echo-n"$i$j"rg".*$i$j$"$words|厕所-l|awk'{print$1}'donedone}run>occurance.txttecho"最常见的3种组合"catoccurrence.txt|排序-nk2,2-r|head-n3echo-n"总有"catoccurrence.txt|awk'BEGIN{num=0}$2~"0"{num+=1}END{printfnum}'echo"组合"echo"从未出现的组合"catoccurrence.txt|awk'{if($2=="0")print$1}'>nevershowed.txtpaste-s-d,就地替换nevershowed.txt听起来很诱人,例如:seds/REGEX/SUBSTITUTION/input.txt>输入.txt。但这不是一个明智的做法,为什么呢?或者这只适用于sed?请参阅mansed来完成此问题,以找出最近十次启动的平均、中值和最大启动时间。在Linux上需要journalctl,在macOS上需要logshow。找到每次播放开始和结束的时间戳。Linux上类似操作:Logsbeginat...andsystemd[577]:Startupfinishedin...macOS上查找:===systemboot:andPreviousshutdowncause:5查看前三次重启的启动信息不同的部分(参见journalctl的b选项)。把这个任务分成几个步骤,首先获取前3次启动的启动日志,也许获取启动日志的命令有合适的选项帮你提取前3次启动的日志,或者你可以使用sed'0,/STRING/d'删除STRING匹配的字符串之前的所有内容。然后,过滤掉每次都不同的部分,比如时间戳。接下来,重复记录输入行并对其进行计数(您可以使用uniq)。最后,删除出现3次的所有内容(因为这些在最近3次启动的日志中是重复的)。在网上找到这样或这样的数据集。或者从这里找到一些。使用curl获取数据集,提取两列数据。如果你想获取的是HTML数据,[pup](https://github.com/EricChiang/pup)可能更有帮助。对于JSON类型的数据,可以试试[jq](https://stedolan.github.io/jq/)。用一个命令求出一列中的最大值和最小值,用另一个命令计算两列之差之和。
