从学Linux开始,这俩就一直学学忘忘,记录下sed和awk的初阶使用
sed
sed编辑器全程流处理编辑器stream editor,
流处理编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。sed预先设计的命令,要么从命令行输入,要么存储在命令文件里。
sed不会修改原文件
具体执行步骤:
- 一次从输入中读取一行数据
- 根据所提供的编辑器命令匹配数据
- 按照命令修改流中的数据
- 将新的数据输出到STDOUT
格式: sed option script file
选项:
选项 | 描述 |
---|---|
-e script | 将script中指定的命令添加到已有命令中 |
-f file | 将file中指定的命令添加到已有命令中 |
-n | 不产生命令输出,一般和p配合使用 |
执行编辑器命令
命令行定义编辑器命令
echo "This is a test" | sed 's/test/cat/'
替换test为cat
命令行定义多个编辑器命令
echo "This is a test" | sed 's/a/two/; s/test/cats/'
多个命令之间用分号隔开
从文件读取编辑器命令
cat script.sed
1 | s/a/two/ |
sed -f script.sed data1.txt
替换
替换标记
格式:s/pattern/replacement/flags
标记 | 描述 |
---|---|
数字 | 新文本将替换第几处模式匹配的地方 |
g | 新文本会替换所有匹配的文本 |
p | 输出修改过的行 |
w file | 将替换结果写入file文件 |
指定匹配数替换
sed 's/test/cat/2' data.txt
替换每行第二次匹配的test为cat
打印修改过的内容
sed -n 's/test/cat/p' data.txt
-n不产生命令输出,p输出修改过的行,合在一起,只输出修改过的行
写更改内容
sed 's/test/cat/w test.txt' data.txt
将涉及到test改为cat的行,写到text.txt文件中
过滤器
sed提供两种形式的过滤
- 以行数字形式的行区间过滤
- 文本形式的行过滤
行地址过滤
单行号
sed '2s/dog/cat/' data.txt
过滤出第二行,只将第二行的dog替换为cat
行区间
sed '2,4s/dog/cat/' data.txt
过滤出第2-4行,将2,3,4行的dog替换为cat
指定行开始的所有行
sed '2,$s/dog/cat/' data.txt
过滤出第二行开始到最后一行,替换第二行开始到最后一行的dog为cat
文本过滤
格式: /pattern/command
pattern前必须要用正斜线封装
sed '/kyle/s/bash/csh' /etc/passwd
过滤出用户kyle,将默认的shell改为csh
组合命令过滤
格式
1 | address { |
如果需要在单行上执行多条命令,需要用花括号将多条命令组合在一起,命令之间可以用换行或者分号隔开sed '2{s/a/two/; s/dog/cats/}' data.txt
过滤到第二行,替换第二行的a为two,dog为cats
增删改查
增
sed有两种插入方式,i(insert)
和a(append)
,分别是在指定行前以及指定行后插入
格式: sed '[address]command\'
sed '3i\This is a inserted line.' data.txt
在第三行前插入
sed '3a\This is an appended line.' data.txt
在第三行后插入
sed '$a\This is an appended line.' data.txt
在文件末尾插入
删
删和过滤类似sed '3d' data.txt
删除第三行sed '3,4d' data.txt
删除3,4行sed '3,$d' data.txt
删除第三行开始到最后sed '/dog/d' data.txt
删除匹配到dog的行
改
整行修改
改和删也类似
sed '3c\This is a changed line' data.txt
改第三行sed '3,4c\This is a changed line' data.txt
改3,4行sed '3,$c\This is a changed line' data.txt
改第三行开始到最后sed '/dog/c\' data.txt
改匹配到dog的行
文本替换
格式:[address]/inchars/outchars/
其中inchars和outchars的值一一对应(长度一致)sed 'y/123/789/' data.txt
将1替换成7,2换成8,3换成9
awk
这边使用的是awk的GUN版本gawk。
格式:gawk options program file
选项
选项 | 描述 |
---|---|
-F fs | 指定数据分隔符 |
-f file | 从指定文件中读取程序 |
gawk的脚本命令必须放在两个花括号({})里面
使用数据字段变量
gawk会自动给一行中的每个数据元素分配一个变量,默认情况下按如下方式分配:
字段 | 描述 |
---|---|
$0 | 整个文件行 |
$1 | 文本行中第一个数据字段 |
$2 | 文本行中第二个数据字段 |
$n | 文本行中第n个数据字段 |
gawk {print $1} data.txt
输出所有行的第一个数据字段
指定分隔符
gawk -F ':' {print $1} /etc/passwd
指定分隔符为冒号’:’,输出每行分割之后的第一个数据字段
脚本使用多个程序命令
echo "This is a cat" | gawk '{$4="dog"; print $0}'
多个命令之间用分号隔开
从文件读取程序
cat script.gawk
1 | {print $1 "'s home directory is " $6} |
gawk -F ':' -f script.gawk /etc/passwd
执行效果:
1 | root's home directory is /root |
数据处理前后动作
gawk允许在数据处理前后使用BEGIN和END关键字指定运行前和运行后的动作。
cat script.gawk
1 | BEGIN{ |
gawk -F ':' -f script.gawk /etc/passwd
执行效果:
1 | The latest list of users and shells |
以上为sed和awk的基础入门部分,熟能生巧,完~