我们先来看一下力扣上的shell题库中的一题:
实现这个功能一般来说我们会想到tail和head命令来指定打印前几行或者后几行。但使用sed命令可以更简洁的实现相同的功能:
tail -n+10 file.txt | head -1 # 利用sed或awk sed -n '10p' file.txt -n: 仅显示script处理后的结果 p: 打印 匹配行 awk "NR==10" file.txt
sed的用法
sed 是一种流编辑器,它是文本处理中非常重要的工具,本身是一个管道命令,主要是以行为单位进行处理,支持正则表达式,不影响源文件,可以将数据行进行替换、删除、新增、选取等特定工作。
命令格式
1. sed [options] 'command' file(s) 2. sed [options] -f scriptfile file(s)
参数:文件 指定待处理的文本文件列表
sed常用选项
- -e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;
- -f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件;
- -h或--help:显示帮助;
- -n或--quiet或——silent:仅显示script处理后的结果;
- -V或--version:显示版本信息。
sed常用命令
- a\ # 在当前行下面插入文本。
- i\ # 在当前行上面插入文本。
- c\ # 把选定的行改为新的文本。
- d # 删除,删除选择的行。
- D # 删除模板块的第一行。
- p # 打印模板块的行。
- P # (大写) 打印模板块的第一行。
- s # 替换指定字符
sed常用场景
sed最常用的就是替换操作。
sed替换标记
g # 表示行内全面替换。
p # 表示打印行。
w # 表示把行写入一个文件。
x # 表示互换模板块中的文本和缓冲区中的文本。
y # 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 # 子串匹配标记
& # 已匹配字符串标记
常用场景示例:
# 用linux替换全部unix sed 's/unix/linux/g' test.txt # 只替换第三个 sed '3 s/unix/linux/g' test.txt # 在范围内替换 sed '1,3 s/unix/linux/g' geekfile.txt
s 命令表示替换 第二个参数unix表示原内容 第三个参数linux表示替换内容 g表示全局替换
注意: 如果我们仅仅是想对单词进行修改的话,因为sed做的是文本匹配,可能会出现把一些文件的前缀或者后缀替换的操作。解决办法是单词后面加个空格 。
awk的用法
awk命令与sed不同,它是按列处理,支持正则表达式。它在命令行中使用,但更多是作为脚本来使用。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。
命令格式
awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s)
awk常用选项
- -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:,默认的分隔符是连续的空格或制表符
- -v var=value 赋值一个用户定义变量,将外部变量传递给awk
- -f scripfile 从脚本文件中读取awk命令
- -m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
awk常用场景
awk获取指定行
awk '{ print $2,$3 }' filename
awk查看进程pid
1. sheepxi 1234 a1 2. sheepfri 5678 a2 3. sheepman 1000 c1
常用场景:比如说我们在开发时需要查看一下当前有哪些进程正在跑
此时如果我们需要打印一下进程id,我们可以管道符连接awk 进行查看