AWK文本处理和SED文本处理

AWK 文本处理

awk 是一种文本处理工具,可以用于对文本文件进行处理、分析和格式化输出。它最初是由 Alfred AhoPeter Weinberger Brian Kernighan 1977 年开发的,名称来自于他们的姓氏的首字母。

awk 可以通过在命令行中指定模式(pattern)和动作(action)来对文本进行处理。模式用于匹配文本中的某些部分,动作用于对匹配到的部分进行处理。awk 命令的基本语法如下:

awk 'pattern {action}' filename

其中,pattern action 可以省略其中一个或两个,filename 表示要处理的文本文件名。当指定了 pattern 时,awk 会匹配文本中符合该模式的部分,并对其执行 action 中指定的处理操作;当没有指定 pattern 时,awk 会对文本中的每一行都执行 action 中指定的处理操作。

awk把所要处理的字符串 按行 读入到内存进行分段处理。默认情况下是以空格或者tab作为分隔符,对每个分段都分配一个名字,第1部分用$1表示,第2部分用$2表示以此类推,整行内容用$0表示,具体如下图:

$1

$2

$3

...

$n

 

如果想对哪部分进行操作的话,直接用$nn是数字)指定就可以了,这里的的操作一般是指print

awk的基本语法:

awk ‘{print $n}’

例如:

对于一个字符串 my name is tom 来说,使用awk对其操作的时候,首先会对这段字符进行分段如下:

my

name

is

tom

$1

$2

$3

$4

如果想打印name这个词,我们看到name是属于第二部分,只要打印$2即可:

[root@user01 ~]# echo "my name is tom" | awk '{print $2}'

name

如果想打印第1部分和第3部分,可以用逗号隔开:

[root@user01 ~]# echo "my name is tom" | awk '{print $1,$3}'

my is

这里用逗号隔开的话,显示的结果是空格进行连接,如果不用逗号的话,结果是连在一起的:

[root@user01 ~]# echo "my name is tom" | awk '{print $1$3}'

myis

如果想指定连接符的话,需要单独指定连接符,用双引号指定分隔符,如下:

[root@user01 ~]# echo "my name is tom" | awk '{print $1"-"$3}'

my-is

如果想打印整行内容的话,可以直接打印$0即可:

[root@user01 ~]# echo "my name is tom" | awk '{print $0}'

my name is tom

在用awk的时候,还可以先判断要处理的这行字符串里是否存在某关键字,如果存在才执行大括号里的操作,如果不存在则忽略,用法如下:

awk ‘/关键字/{print $n}’

如果含有tom这个关键字,才开始打印$1

[root@user01 ~]# echo "my name is tom" | awk /tom/'{print $1}'

my

[root@user01 ~]# echo "my name is tom" | awk /toma/'{print $1}'

[root@user01 ~]#

如果含有toma才打印,如果不含有则不操作:

[root@user01 ~]# echo "my name is tom" | awk /toma/'{print $1}'

[root@user01 ~]#

前面讲默认分段的分隔符是空格或者tab,如果使用其他的分隔符的话,需要使用-F来指定

[root@user01 ~]# echo "my name,is-tom" | awk '{print $3}'

[root@user01 ~]# echo "my name,is-tom" | awk '{print $2}'

name,is-tom

[root@user01 ~]# echo "my name,is-tom" | awk -F- '{print $2}'

tom

[root@user01 ~]# echo "my name,is-tom" | awk -F, '{print $2}'

is-tom

[root@user01 ~]# echo "my name,is-tom" | awk -F, '{print $1}'

my name

如果想同时以-或者,作为分隔符呢?可以这样写:

[root@user01 ~]# echo "my name,is-tom" | awk -F'[,-]' '{print $1}'

my name

如果想同时以空格 或者-或者,作为分隔符呢?可以这样写:

[root@user01 ~]# echo "my name,is-tom" | awk -F'[,-]| ' '{print $1}'

my

取出当前IP地址

[root@user01 ~]# ifconfig ens33 | grep inet | head -1 | awk '{print $2}'

192.168.100.134

取出所有用户名

[root@user01 ~]# cat /etc/passwd | awk -F: '{print $1}'

 

SED 文本处理 

sedStream Editor)是一个用于文本编辑的流式编辑器,它可以对文本文件进行增、删、改、查等操作,是 Linux 系统中非常常用的文本处理工具之一。

sed 命令的语法格式如下:

sed [options] 'command' filename

其中,options sed 命令的选项,command sed 命令的操作命令,filename 为要处理的文件名。

sed 命令的操作命令可以是一个或多个编辑命令,每个命令都以单引号括起来,多个命令之间使用分号隔开。常用的 sed 命令包括:

  • p:打印匹配行;
  • d:删除匹配行;
  • s:替换匹配字符串;
  • a:在匹配行后添加一行文本;
  • i:在匹配行前插入一行文本;
  • c:用新文本替换匹配行。

例如,下面的命令可以将文件 file.txt 中的所有 "hello" 替换为 "world"

sed 's/hello/world/g' file.txt

其中,s 表示替换操作,hello 表示要替换的字符串,world 表示替换后的字符串,g 表示全局替换。

另外,sed 还支持正则表达式和模式空间等高级特性,可以实现更加复杂的文本处理操作。例如,下面的命令可以将文件 file.txt 中所有以数字开头的行删除:

sed '/^[0-9]/d' file.txt

其中,/^[0-9]/ 表示以数字开头的行,d 表示删除匹配行。

 

行显示 

  • n 显示指定内容(仅屏幕输出)

例如,下面的命令针对某文件查找行

[root@user01 ~]# cp /etc/passwd .

[root@user01 ~]# sed -n '2 p' passwd

bin:x:1:1:bin:/bin:/sbin/nologin

[root@user01 ~]# sed -n '2! p' passwd --取反操作,除了第2行不打印,其他都打印

[root@user01 ~]# sed -n '1,2 p' passwd

[root@user01 ~]# sed -n '5,10 p' passwd

也可以打印具体关键字的行

[root@user01 ~]# sed -n '/root/ p' passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

[root@user01 ~]# sed -n '/^root/ p' passwd

root:x:0:0:root:/root:/bin/bash

 

 添加行

  • a 在指定行后面添加行(仅屏幕输出)

注意是添加显示,类似于查询操作,并不会影响源文件

[root@user01 ~]# sed '10a test:test:test' passwd 在第10行后面添加 test:test:test

[root@user01 ~]# sed '10,11a test:test:test' passwd 在第10行和11行后面都添加 test:test:test

[root@user01 ~]# sed 'a test:test:test' passwd 在每一行后面添加 test:test:test

[root@user01 ~]# sed '$a test:test:test' passwd 在最后一行后面添加 test:test:test

 

 插入行

  • i 在指定行前面插入行(仅屏幕输出)

注意是插入(插队)显示,类似于查询操作,并不会影响源文件

[root@user01 ~]# sed '10i test:test:test' passwd 在第10行后面添加 test:test:test

[root@user01 ~]# sed '10,11i test:test:test' passwd 在第10行和11行后面都添加 test:test:test

[root@user01 ~]# sed 'i test:test:test' passwd 在每一行后面添加 test:test:test

[root@user01 ~]# sed '$i test:test:test' passwd 在最后一行后面添加 test:test:test

 

 删除行

  • d 删除指定行(仅屏幕输出)

注意是删除显示,类似于查询操作,并不会影响源文件

[root@user01 ~]# sed '10d' passwd 删除第10

[root@user01 ~]# sed '10,11d' passwd 删除1011

[root@user01 ~]# sed 'd' passwd 删除所有

[root@user01 ~]# sed '$d' passwd 删除最后一行

 

替换行 

  • s 替换指定行(仅屏幕输出)

注意是替换显示,类似于查询操作,并不会影响源文件

[root@user01 ~]# sed 's/root/rootroot/' passwd root替换成rootroot

[root@user01 ~]# sed 's#root#rootroot#' passwd root替换成rootroot

[root@user01 ~]# sed 's#root#rootroot#g' passwd 将全局root替换成rootroot

[root@user01 ~]# sed 's/root/rootroot/g' passwd 将全局root替换成rootroot

 

测试 

将文件内容所有root更换为henry

[root@user01 ~]# sed -i 's#root#henry#g' passwd

 

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值