Shell分享(一)
本次分享的Shell指令主要包含两个核心的指令:
- SED指令
- AWK指令
SED指令
SED是流编辑器(stream editor)的缩写,它的工作流程一般包括为读取、执行和显示。
读取:SED从输入流(标准输入、管道或者文件)中读取一行并且存储到一个叫做模式空间的(pattern buffer)的内存缓冲区。
执行:一般的情况下,SED命令在模式空间中顺序执行,除非我们指定行的地址,否则SED会一条一条的执行。
显示:发送修改后的内容到输出流,当数据发送之后,模式空间的内容会被清空。
上述的过程在文件所有内容处理完成之前,会重复的执行。
注意点:
- 模式空间(pattern buffer)是一块活跃的缓冲区,在SED编辑器执行命令时它会保存待检查的文本。
- 默认情况下,所有的SED命令都是在模式空间中执行,因此输入文件并不会发生改变。
- 还有另外一个缓冲区叫做保持空间(hold buffer),在处理模式空间中的某些行时,可以用保持空间来临时保存一些行。在每一个循环结束的时候,SED将会移除模式空间中的内容,但是该缓冲区中的内容在所有的循环过程中是持久存储的。SED命令无法直接在该缓冲区中执行,因此SED允许数据在 保持空间 和 模式空间之间切换。
- 初始情况下,保持空间 和 模式空间 这两个缓冲区都是空的。
- 如果没有提供输入文件的话,SED将会从标准输入接收请求。
- 如果没有提供地址范围的话,默认情况下SED将会对所有的行进行操作。
基本格式
SED [option][filename]
选项:
- * -i: 直接修改读取的文件内容,而不输出到终端*
- * -n:使用安静模式,只有经过sed处理的行才会被显示出来*
- * -e:指定要执行的命令,使用该参数,我们可以指定多个命令*
- * -f:指定要执行命令的脚本文件*
例如:
sed -e ‘1d’ -e ‘p’ sed.txt 这条指令我们执行了删除命令与打印了每行两次
echo ‘1d\n3d\n5d’ > com.txt , sed -f com.txt sed2.txt ,这条操作我们执行了com.txt文件中的命令来删除sed2.txt 文件中的第1、3、5行操作
行寻址
默认情况下SED中使用的命令会作用于文本所有的行,如果需要对特定的行或者某些行进行操作,则可以使用行寻址功能。
在SED中包含两种形式的行寻址:
1. 数字形式的行寻址
语法格式:[address]command
例如:
sed -n ‘3p’ sed2.txt 打印第三行
sed -n ‘2,5 p’ sed2.tx 打印第二行到第5行
2. 使用文本模式过滤器
语法格式:/pattern/command
例如:sed -n ‘/aaaa/ p’ sed2.txt
使用 “,” 操作符指定匹配多个匹配模式,例如我们可以这样:
sed -n ‘/aaaaa/, /gggg/ p’ sed2.txt
基本命令
这部分会列出SED中常用的一些命令,如DELET、WRITE、APPEND、CHANGE、INSERT、TRANSLATE、QUIT、READ、EXECUTE等命令。
删除命令:d
格式:[address1[,address2] d
address1与address2是开始和截止地址,它可以是行号,也可以是字符串匹配模式,这两种地址都是可选的。
同样,delete是用来执行行删除操作的,但是注意,删除的行是删除模式空间的行,并不会影响原始文件内容。
例如:sed ‘d’ sed.txt 该命令不会输出任何内容,默认情况下,SED将会对每一行执行删除的操作,所以在标准输出中不会有任何的内容进行输出。
sed ‘2d’ sed.txt sed.txt删除文件中的第2行。
SED也接受使用逗号(,)分隔地址范围。所以我们可以构造地址范围来删除范围的内容。如:sed ‘2,4 d’ sed.txt。
当然也可以通过指定模式匹配作为地址来进行删除操作,例如:sed ‘/Storm/,/Fellowship/d’ books.txt
文件写入命令:w
SED中提供了w命令用来将模式空间的内容写入到文件,它与d命令相似。
格式:[address1[,address2] w file
w为写入命令,file为要写入的文件,值得注意的是,当我们写入的文件不存在的时候该文件会自动的创建,如果写入的文件存在的话,那么该文件的内容会被覆盖。
利用w命令,我们得到同cp相类似的效果,但是w命令还可以支持对文件的部分内容进行写操作,例如:sed -n ‘2~2 w part.txt’ sed.txt
同样,还有一个场景,当我们需要对文件进行分类的时候,这个时候可以使用w进行操作,同d命令一样,w命令支持匹配模式作为地址来进行写入操作,如:
sed -n -e '/Martin/ w Martin.txt' -e '/Paulo/ w Paulo.txt' -e '/Tolkien/ w Tolkien.txt' books.txt
追加命令:a
格式:[address]a Append text
例如在第4行之后添加一本书的话,那么执行:
sed '4 a 7) Adultry, Paulo Coelho, 234' books.txt
行替换命令:c
SED中同过c命令来执行‘change’和‘replace’操作,该命令是利用新的行来替换已经存在的行。
格式:[address1[,address2] c Replace text
例如,替换文本中的第4行内容:
sed '4 c 4) Adultry, Paulo Coelho, 324' books.txt
当然,行替换命令也是支持多行替换的,当提供地址范围的时候,所有的行都会被作为一组被单行给替换掉。下面将4-6行的内容替换为单行:
sed '4, 6 c 4) Adultry, Paulo Coelho, 324'