sed和awk记录

从学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
2
s/a/two/
s/test/cats/

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
2
3
4
address {
command 1
command 2
}

如果需要在单行上执行多条命令,需要用花括号将多条命令组合在一起,命令之间可以用换行或者分号隔开
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
2
3
4
5
6
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
... ...
sshd's home directory is /var/empty/sshd
kyle's home directory is /home/kyle

数据处理前后动作

gawk允许在数据处理前后使用BEGINEND关键字指定运行前和运行后的动作。

cat script.gawk

1
2
3
4
5
6
7
8
9
10
11
12
13
BEGIN{
print "The latest list of users and shells"
print " USERID \t SHELL"
print "-------- \t --------"
}

{
print $1 " \t " $7
}

END{
print "This concludes the listing"
}

gawk -F ':' -f script.gawk /etc/passwd
执行效果:

1
2
3
4
5
6
7
8
The latest list of users and shells
USERID SHELL
-------- --------
root /bin/bash
bin /sbin/nologin
... ...
kyle /bin/bash
This concludes the listing

以上为sed和awk的基础入门部分,熟能生巧,完~

文章目录
  1. sed
    1. 执行编辑器命令
      1. 命令行定义编辑器命令
      2. 命令行定义多个编辑器命令
      3. 从文件读取编辑器命令
    2. 替换
      1. 替换标记
      2. 指定匹配数替换
      3. 打印修改过的内容
      4. 写更改内容
    3. 过滤器
      1. 行地址过滤
        1. 单行号
        2. 行区间
        3. 指定行开始的所有行
      2. 文本过滤
      3. 组合命令过滤
    4. 增删改查
        1. 整行修改
        2. 文本替换
  2. awk
    1. 使用数据字段变量
    2. 指定分隔符
    3. 脚本使用多个程序命令
    4. 从文件读取程序
    5. 数据处理前后动作
|