sed(流编辑器,“stream editor”的缩写)。 他与grep,awk 称为Linux 文本处理三剑客。
替换文件字符串
s
表示替换所有行,1,2s 代表替换1到2行,1s代表替换第1行g
表示全局,意味着行中的所有匹配项都将被替换-in-place 或 -i
(Mac Terminal 不支持 -i,Linux都支持):直接修改原文件(实际上,在后台创建了一个临时输出文件,然后将原始文件替换为临时文件)
⚠️ 别缺了最后一个斜杠(如 ‘s/mark/mk’),否则会报 unterminated `s’ command 错误
其他sed 用法
下面使用d 命令删除空行或只包含空格的行:
sed '/^\s*$/d' sedtest
sed 's/mark/mk/g; s/li//g' testfile 通过分号连接两个命令
sed '2,5d' testfile 将第2~5行删除
sed '3,$d' testfile 将第3~最后一行删除
变量
a="mark"
b="build"
sed 's/$a/$b/' testfile
一些转义
sed "s/<\/body>/<\/body><a href='https:\/\/mb.com'>\&\!<\/a>/" testfile
sed -n -r '/^(\([0-9]{3}\)\s|[0-9]{3}-)[0-9]{3}-[0-9]{4}$/p' testfile # 正则过滤
sed -n '3p' testfile # 打印第3行
Linux 文本处理三剑客之grep
grep(globally search a regular expression and print)
grep -n '2019-10-24 00:01:11' *.log # 查看某个时间日志, -n:显示行号
grep -i pattern file # -i:忽略大小写
grep pattern -r dir/ # 递归搜索
grep -P '^(\(\d{3}\)\s|\d{3}-)\d{3}-\d{4}$' testfile # 正则过滤
grep "^\(([0-9]\{3\})\s\|[0-9]\{3\}-\)[0-9]\{3\}-[0-9]\{4\}$" testfile # 不加P的正则过滤(MacBook Terminal只能用这种), 像vim 替换一样,需要另外转义\+, \{n\}, \(, \| 等而本身的字符不需转义
Linux 文本处理三剑客之awk
awk 理论上可代替 grep
awk '{print $1,$4}' log.txt # 打印每一行的第1,4列(awk默认以空格划分列, 没有第4列打印空)
awk -F ',' '{print $1, $4}' log.txt # 我们可以用-F标志指定分隔符
awk -F '[ ,]' '{print $1, $4}' log.txt # 同时指定空格和逗号,为分隔符
awk '{printf "%-8s %-10s\n",$1,$4}' log.txt # 格式化打印,1第列的内容占8个字符,第2列内容占10个字符,如果内容比位置长,空一格
awk 'NR>1' log.txt # 过滤第一行
awk 'NR==2{print $0}' test.file # 打印第2行
awk 'NR==2{print $1,$3,NR}' log.txt # 取第2行,并打印1,3列和行号
awk '/ERROR/{print $1,$3}' log.txt # 过滤含有ERROR的行,并打印1,3列
awk '/^(\([0-9]{3}\)\s|[0-9]{3}-)[0-9]{3}-[0-9]{4}$/' testfile # 正则过滤
pipe流处理
tail -f x.log | grep pattern
tail -n 1 testfile # 打印倒数第一行
head -n 3 testfile # 打印第3行