Linux再学--shell基础6sed和awk

这篇主要是介绍行编辑器sed和awk的使用,之前我们基本都有了解过vim编辑器,vim是以文件为模式的编辑器,主要是交互式,进入后需要使用命令来操作,例如:i 进入插入模式,wq保存退出等;而sen和awk是非交互式的行操作;

sed

sed 一般用于对文本内容的替换;基本使用如下:

sed '/user1/s/user/u1' /etc/pwd

上面是一个替换指令s指令,前面双斜线括起来的是正则表达式,其后面的也可以是正则表达式;

  1. sed最常用最重要的作用就是去进行替换;
    sed内部工作原理,模式空间处理

    • 将文件以行为单位读取到内存(模式空间);
    • 使用sed的每个脚本对改行进行操作;
    • 处理完成后输出此行;
  2. 替换命令s
    其最简单的使用如下:

 sed 's/oldStr/newStr/' filename

上述命令的意思是使用newStr字符串去替换oldStr,注意两个字符都是被//包裹,然后后跟要操作的文件;这里oldStr是可以使用元字符正则表达式进行替换;
我们桌面有一份日志文件如下:

#webrtcNative.log
[2022-06-07 10:33:39](peer_connection.cc:1117): (Initialize): start log record! old_allLogCount=0, old_infoLogCount=0, new_allLogCount=1, new_infoLogCount=1
[2022-06-07 10:33:39](peer_connection.cc:1126): hosten 1 (Initialize) configuration.isMutlClass = 1
[2022-06-07 10:33:39](peer_connection.cc:1128): hosten 2 (Initialize) ======================初始化多人=================== 
[2022-06-07 13:35:22][582:526] [39439] (RTCLogging.mm:35): (RTCNativeAudioSessionDelegateAdapter.mm:62 -[RTCNativeAudioSessionDelegateAdapter rtcAudioSessionDidChangeRoute:reason:previousRoute:]): Ignoring RouteConfigurationChange
[2022-06-07 13:35:22][582:617] [137663] (connection.cc:357): set_use_candidate_attr = 0

我们使用上述方式替换把06替换掉:sed 's/06/00012/' webrtcNative.log或者简写sed 's/06/00012/;s/07/09/' webrtcNative.log,执行后效果如下:
在这里插入图片描述
当然上述命令执行完成后源文件并不会被改变,如果需要替换后修改文件内容就需要-i,使用方式如下:
注意:MacOS使用的是sed的BSD版本,它对-i选项的处理略有不同,所以下列是macOS的使用方式:sed -i "_back" 's/06/00012/;s/07/09/' webrtcNative.log,其中"_back" 也可以是" ",执行命令后就是在同目录下生成一个新的文件,如图:
在这里插入图片描述
打开后面的文件可以看到内容已经被修改成我们需要的;

  1. 多个替换
    当需要替换多个的时候可以使用下列方式:
 sed -e 's/oldStr/newStr/' -e 's/oldStr/newStr/' filename filname1 ...
 sed -i 's/oldStr/newStr/' 's/oldStr/newStr/' filename filname1 ...

-i的含义是将替换的结果原样写回文件中;
多个替换命令-e的执行效果如下:

 sed -e 's/06/00012/' -e 's/07/09/' webrtcNative.log

执行后:
在这里插入图片描述

可以看到文件中06-07被两次替换成了00012-09
4. 正则替换
使用:sed 's/^\[/\{l/' webrtcNative.log命令去替换亿[开头的,并且提花成{,执行后效果:
在这里插入图片描述
5. sed的替换命令加强版
* 全局替换:在s命令的最后加上g's/oldStr/newStr/g',用于替换所有出现的的次数;
* 标志位:'s/oldStr/newStr/标志位' 标志位是数字,代表出现第几次才替换;g,全部都替换;p,打印模式空间的内容;
* 寻址: 替换默认是对文件中所有行进行替换,增加寻址后可以对指定的行进行操作;正则s/oldStr/newStr/'
* 分组:寻址可以匹配多条命令,使用方式:/正则/{s/oldStr/newStr/;s/oldStr/newStr/}
* sed脚本文件:可以将sed的参数保存成文件 使用 -f调用;sed -f secfile fileName;

awk

awk 一般用于对文本内容进行统计、按照需要的格式进行输出;基本使用如下:

awk -F:'/wd$/{print $1}' /etc/password

猜你喜欢

转载自blog.csdn.net/lym594887256/article/details/125173202
今日推荐