这篇主要是介绍行编辑器
sed和awk的使用,之前我们基本都有了解过vim编辑器,vim是以文件为模式的编辑器,主要是交互式,进入后需要使用命令来操作,例如:i
进入插入模式,wq
保存退出等;而sen和awk是非交互式的行操作;
sed
sed 一般用于对文本内容的替换;基本使用如下:
sed '/user1/s/user/u1' /etc/pwd
上面是一个替换指令s指令
,前面双斜线括起来的是正则表达式,其后面的也可以是正则表达式;
-
sed最常用最重要的作用就是去进行替换;
sed内部工作原理,模式空间处理
;- 将文件以行为单位读取到内存(模式空间);
- 使用sed的每个脚本对改行进行操作;
- 处理完成后输出此行;
-
替换命令
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"
也可以是" "
,执行命令后就是在同目录下生成一个新的文件,如图:
打开后面的文件可以看到内容已经被修改成我们需要的;
- 多个替换
当需要替换多个的时候可以使用下列方式:
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