1.学习一下这篇简短的 交互式正则表达式教程.
RegexOne - Learn Regular Expressions - Lesson 1: An Introduction, and the ABCs
2.统计words文件 (/usr/share/dict/words
) 中包含至少三个a
且不以's
结尾的单词个数。
cat words | tr A-Z a-z | grep -E '^([^a]*a){3}' | grep -v "'s$" | wc -l
这些单词中,出现频率前三的末尾两个字母是什么?
cat words | tr A-Z a-z | grep -E '^([^a]*a){3}' | grep -v "'s$" | sed -E "s/.*([a-z]{2})$/\1/" | sort | uniq -c | sort -rn | head -3
sed
的 y
命令,或者 tr
程序也许可以帮你解决大小写的问题。共存在多少种词尾两字母组合?
cat words | tr A-Z a-z | grep -E '^([^a]*a){3}' | grep -v "'s$" | sed -E "s/.*([a-z]{2})$/\1/" | sort | uniq | wc -l
还有一个很 有挑战性的问题:哪个组合从未出现过?
#!/bin/bash
for i in {a..z}
do
for j in {a..z}
do
echo "$i$j"
done
done
/all_combin.sh > all_com.txt
cat /usr/share/dict/words | tr A-Z a-z | grep -E '^([^a]*a){3}' | grep -v "'s$" | sed -E "s/.*([a-z]{2})$/\1/" | sort | uniq > part.txt
comm -23 all_com.txt part.txt
3.进行原地替换听上去很有诱惑力,例如: sed s/REGEX/SUBSTITUTION/ input.txt > input.txt
。但是这并不是一个明智的做法,为什么呢?还是说只有 sed
是这样的? 查看 man sed
来完成这个问题。
4.找出您最近十次开机的开机时间平均数、中位数和最长时间。在Linux上需要用到 journalctl
,而在 macOS 上使用 log show
。找到每次起到开始和结束时的时间戳。
平均数
journalctl -q | grep "Startup finished in" | sed -E 's/(.*)s\.$/\1/' | tail -10 | gawk '{print $NF}' | sort -n | paste -s -d "+" | bc | gawk '{print $1 /10}'
中位数
journalctl -q | grep "Startup finished in" | sed -E 's/(.*)s\.$/\1/' | tail -10 | gawk '{print $NF}' | sort -n | paste -s | gawk '{print ($5 + $6) / 2}'
最长时间
journalctl -q | grep "Startup finished in" | tail -10 | gawk '{print $NF}' | sort -n | tail -1
5.查看之前三次重启启动信息中不同的部分(参见 journalctl
的-b
选项)。将这一任务分为几个步骤,首先获取之前三次启动的启动日志,也许获取启动日志的命令就有合适的选项可以帮助您提取前三次启动的日志,亦或者您可以使用sed '0,/STRING/d'
来删除STRING
匹配到的字符串前面的全部内容。然后,过滤掉每次都不相同的部分,例如时间戳。下一步,重复记录输入行并对其计数(可以使用uniq
)。最后,删除所有出现过3次的内容(因为这些内容是三次启动日志中的重复部分)。