sed
sed是流编辑器,是会在编辑器处理数据之前要预先提供一组规则来编辑数据流。sed根据命令来处理数据流中的数据,这些命令来自命令行输入或者存储在一个命令文本文件中。
sed的处理过程是:
- 一次从输入中读取一行数据
- 根据所提供的编辑器命令匹配数据
- 按照命令修改流中的数据
- 将新的数据输出到STDOUT
sed命令的格式:
sed options script file
选项:
-e script
将script中的命令添加到已有命令中
-f file
将file中的命令添加到已有命令中
-n
用print命令来完成输出
- 在命令行定义编辑器命令
echo "this is a test" | sed 's/test/big'
s命令表示将斜线中第一个文本替换为斜线中第二个文本。
sed 's/dog/cat' data.txt
sed不会修改文本文件的数据,只是将修改后的数据发送到STDOUT
- 在命令行使用多个编辑器命令
sed -e 's/a/b;s/c/d' data.txt
两个命令都作用到文本的每行数据上,命令之间必须用分号隔开
- 从文件中读取编辑器命令
如果有大量要处理的sed命令,那么把它们单独放到一个文件里会方便些,每一行都是一个命令,且不用加分号。
sed -f script1.sed data1.txt
- 替换标记
sed中的s替换命令只替换每一行出现的第一处,要使其替换不同的地方出现的文本必须使用替换标记
s/pattern/replacement/flags
4种替换标记
数字:表明替换第几处匹配的地方
g:表明心文本将替换所有匹配的文本
p:表明原先行的内容要打印出来
w file:将替换的结果写到文件中
sed 's/test/trial/2' data4.txt
- 使用地址
默认情况下,在sed编辑器中使用的命令会作用于文本数据所有的行。如果只想将命令作用在特定的行,要使用行寻址
数字形式表示行区间
sed '2s/dog/cat/'
sed '2,3s/dog/cat/'
sed '2,$/dog/cat/'
使用文本过滤器
sed '/Sam/s/bash/csh/'
该命令只能作用到匹配文本模式的行上,但这是固定文本模式,还可以使用正则表达式。
- 删除行
命令d
sed '3d' data.txt
sed '2,3d' data.txt
sed '3,$d' data.txt
- 插入和附加文本
sed编辑器允许向数据流插入和附加文本行。
i 会在指定行前增加一个新行
sed 'i\test'
a 会在指定行后面加一个新行
sed 'a\test'
- 修改行
c命令允许对整行内容进行修改
sed '/number1/c\this is a '
- 转换命令
y转换命令是唯一可以处理单个字符的sed编辑器命令
echo "this 1" | sed 'y/1/4'
- 打印
p命令用于打印文本行
sed '/number3/p' data.txt
打印包含匹配文本模式的行
打印行号
=用于打印行号
sed '=' data.txt
列出行
l命令
- 使用sed来处理文件
w命令用来向文件写入行
w filename
sed '1,2w test.txt' data.txt
将data.txt的1,2行写入test.txt中
从文件读取数据
读取命令r允许将一个独立文件中的数据插入到数据流中
sed '/number2/r data12.txt' data6.txt
-多行命令
gawk程序
gawk是unix中awk程序的GNU版本,它提供一种编程语言,而不只是编辑器命令:
- 定义变量来保存数据
- 使用算数和字符串操作符来处理数据
- 使用结构化编程概念来为数据处理增加处理逻辑
- 通过提取数据文件中的数据元素,将其重新排列或格式化。
gawk命令的格式
gawk options program file
选项:
-F fs 指定行中划分数据字段的字段分隔符
-f file 从指定的文件中读取程序
-v var=value 定义gawk程序中的一个变量及其默认值
-mf N 指定要处理的数据文件中的最大字段数
-mr N 指定数据文件中的最大数据行数
-W keyword 指定gawk的兼容模式或警告等级
gawk可以写脚本来读取文本行的数据,然后处理并显示数据。
gawk '{print "Hello World!"}'
这个程序脚本定义了print命令,从STDIN接受数据,将文本打印到STDOUT。
- 使用数据字段变量
gawk自动给一行中的每个数据元素分配一个变量。 - $0代表整个文本行
- $1代表文本行中的第1个数据字段
- $2代表文本行中的第2个字段
.....
在文本行中,每个数据字段都是通过字段分隔符划分的。gawk默认的字段分隔符是任意的空白字符。
gawk '{print $1}' data.txt
gawk程序读取文本文件,只显示第1个数据字段的值
如果想用其他的字段分隔符,可以用-F选项
gawk -F: '{print $1}' /etc/passwd
- 在程序脚本中使用多个命令
gawk编程语言允许使用多条命令,命令之间用分号隔开。
echo "my u" | gawk '{$1="t"; print $0}'
- 从文件中读取程序
gawk -F: -f script.gawk /etc/passwd
- 在处理数据前运行脚本
有时需要在处理数据前运行脚本,BEGIN强制gawk在读取数据前执行BEGIN关键字后指定的程序脚本
echo "one" | gawk 'BEGIN {print "test"} {print $0}'
- 在处理数据后运行脚本
END关键字允许指定一个程序脚本,gawk在读完数据后执行它
echo "one" | gawk 'BEGIN {print "test"} {print $0} END {print "end"}'
网友评论