当前位置: 首页 > news >正文

文本三剑客其二

文本三剑客其二

sed和awk

grep就是查找文本当中的内容,扩展正则表达式。

sed 对文本内容进行增删改查

sed是一种流编辑器,一次处理一行内容。

如果只是展示,会放在缓冲区(模式空间),展示结束之后,会从模式空间把操作结果删除。

一行一行处理,处理完当前行,才会处理下一行。直到文件末尾。

sed的命令格式和操作选项:

sed -e '操作符' -e '操作符' 文件1 文件2

-e 表示可以跟多个操作符,只要有一个操作,-e可以省略。

sed -e '操作符1;操作符2' 文件1 文件2

选项:

-e:用于执行多个操作命令

-f:在脚本中定义好了操作符,然后根据脚本内容的操作符对文件进行操作

-i:直接修改目标文件(慎用)

-n:仅显示script处理后的结果(不加-n,sed会有两个输出结果,加了-n之后就会把默认输出屏蔽,只显示一个结果)

-r:扩展正则表达式

操作符:

p:打印结果

s:替换,替换字符串

c:替换,替换指定行

y:替换,替换单个字符,多个字符替换必须和替换内容的字符长度保持一致。

d:删除,删除行

a:增加,在指定行的下面一行插入内容

i:增加,在指定行的上面一行插入指定内容

=:标出行号

r:在行后增加文本内容

$a 在最后一行插入新的内容

$i 在最后一行上一行插入新的内容

$r 读取其他文件的内容,然后插入到对象文件的最后一行。

打印功能:

寻址打印

[root@localhost opt]# sed -n '=;p' test1.txt 
1
13770325194
2
13131301010
3
111111111111

打印最后一行

[root@localhost opt]# cat -n test1.txt | sed -n '$p' 9  root1rootroot

行号范围打印:

打印第二行到第六行

[root@localhost opt]# cat -n test1.txt | sed -n '2,6p'2  131313010103  1111111111114  5  6  aaacvvaada

打印第二行和最后一行

[root@localhost opt]# cat -n test1.txt | sed -n '2p;$p'2  131313010109  root1rootroot

打印奇数行

[root@localhost opt]# cat -n test1.txt | sed -n 'p;n'   #n的作用打印一行,跳过下一行1  137703251943  1111111111115  7  root-root9  root1rootroot

打印偶数行

[root@localhost opt]# cat -n test1.txt | sed -n 'n;p'   #n的作用是跳过一行,打印下一行2  131313010104  6  aaacvvaada8  root

如何对文本内容进行过滤

[root@localhost opt]# cat -n test1.txt | sed -n '/o/p'    #过滤并打印包含o的行       //之间是包含的要过滤的内容7  root-root8  root9  root1rootroot

使用正则表达式对文本内容进行过滤

[root@localhost opt]# sed -n '/^root/p'  /etc/passwd    #以root为开头
root:x:0:0:root:/root:/bin/bash
​
[root@localhost opt]# sed -n '/bash$/p'  /etc/passwd    #以bash为结尾
root:x:0:0:root:/root:/bin/bash
zhang:x:1000:1000:zhang:/home/zhang:/bin/bash
dn:x:1001:1001::/home/dn:/bin/bash
xy102:x:1002:1002::/home/xy102:/bin/bash

从指定行开始,打印到第一个bash为结尾的行

[root@localhost opt]# sed -n '42,/bash$/p'  /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zhang:x:1000:1000:zhang:/home/zhang:/bin/bash
面试题1

如何免交互删除文本内容。不删除文件。

[root@localhost opt]# sed -i 'd'  test2.txt 
[root@localhost opt]# cat test2.txt

或者

[root@localhost opt]# cat /dev/null > test2.txt
[root@localhost opt]# cat test2.txt

sed 的删除操作

[root@localhost opt]# sed -in '1,3d;p' test2.txt
4
5
6
7
8

匹配字符串删除行

[root@localhost opt]# sed -n '/1/,/5/d;p' test2.txt
6
7
8
面试题2:

如何免交换的方式删除空行

sed的方式

[root@localhost opt]# sed  '/^$/d' test1.txt 
13770325194
13131301010
111111111111
aaacvvaada
root-root
root
root1rootroot

grep

[root@localhost opt]# grep -v "^$" test1.txt 
13770325194
13131301010
111111111111
aaacvvaada
root-root
root
root1rootroot

cat

[root@localhost opt]# cat test1.txt | tr -s "\n"
13770325194
13131301010
111111111111
aaacvvaada
root-root
root
root1rootroot

sed的替换

s替换字符串:

[root@localhost opt]# sed -n 's/root/test/gp' /etc/passwd       #g是替换所有,g换成数字几就替换每行第几个
test:x:0:0:test:/test:/bin/bash
operator:x:11:0:operator:/test:/sbin/nologin
[root@localhost opt]# sed -n '4,6 s/^/#/p' test1.txt    #注释4-6行
[root@localhost opt]# sed -n -e '4s/^/#/p' -e '6s/^/#/p' test1.txt      #注释4和6行

首字母变成大写

[root@localhost opt]# sed  's/[a-z]/\u&/' test1.txt 
13770325194
13131301010
111111111111
Aaacvvaada
Root-root
Root
Root1rootroot
#u& 是转换首字母大写的特殊符号,\转义符

将单词的字母全部变为大写

[root@localhost opt]# sed  's/[a-z]/\u&/g' test1.txt 
13770325194
13131301010
111111111111
AAACVVAADA
ROOT-ROOT
ROOT
ROOT1ROOTROOT

将大写转换为小写

[root@localhost opt]# sed  's/[A-Z]/\l&/' test3.txt 
aAA
bBB
cCC
dDD
#l&把大写转换成小写的特殊字符,\转义符
[root@localhost opt]# sed  's/[A-Z]/\l&/g' test3.txt 
aaa
bbb
ccc
ddd
#g是将单词的所有字母大写转换为小写

c 整行替换

[root@localhost opt]# sed '/IPADDR=192.168.60.20/c IPADDR=192.168.60.100' /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.60.100
NETMASK=255.255.255.0
GATEWAY=192.168.60.2
DNS1=218.2.135.1
DNS2=221.131.143.69

y 单个字符替换

[root@localhost opt]# sed 'y/abc/123/' test3.txt 
AAA
BBB
CCC
DDD
123

增加

a 在指定行下插入

[root@localhost opt]# sed '/AAA/a zhang' test3.txt 
AAA
zhang
BBB
CCC
DDD
abc
ABD

i 在指定行上一行插入新的内容

[root@localhost opt]# sed '/AAA/i zhang' test3.txt 
zhang
AAA
BBB
CCC
DDD
abc
ABD

r:在行后增加文本内容

[root@localhost opt]# sed '/BBB/r test4.txt' test3.txt 
AAA
BBB
zxc
CCC
DDD
abc
ABD

$a 在最后一行插入新的内容

[root@localhost opt]# sed '$a shuai dn' test3.txt 
AAA
BBB
CCC
DDD
abc
ABD
shuai dn

$i 在最后一行上一行插入新的内容

[root@localhost opt]# sed '$i shuai dn' test3.txt 
AAA
BBB
CCC
DDD
abc
shuai dn
ABD

$r 读取其他文件的内容,然后插入到对象文件的最后一行。

[root@localhost opt]# sed '$r test4.txt' test3.txt 
AAA
BBB
CCC
DDD
abc
ABD
zxc

使用sed命令对字符串和字符的位置进行互换

[root@localhost opt]# echo chengqianshuai | sed -r 's/(cheng)(qian)(shuai)/\3\1\2/'
shuaichengqian
[root@localhost opt]# echo 成乾真的帅 | sed -r 's/(.)(.)(.)(.)(.)/\5\4\3\2\1/'
帅的真乾成

面试题3:
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar

将版本号显示出来

grep

[root@localhost opt]# cat -n 456.txt | grep -E "\b[0-9][.][0-9][.][0-9]\b|\b[0-9][.][0-9]+\b"

sed

[root@localhost opt]# cat 456.txt | sed -r 's/(.*)-(.*)(\.jar)/\2/'
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5

面试题4

打印指定时间内的日志

[root@localhost opt]# cat /var/log/messages | sed -r -n '/Jun 21 12:00:01/,/Jun 21 13:00:01/p'
Jun 21 12:00:01 localhost systemd: Created slice User Slice of root.
Jun 21 12:00:02 localhost systemd: Started Session 255 of user root.
Jun 21 12:00:02 localhost systemd: Removed slice User Slice of root.
Jun 21 12:01:01 localhost systemd: Created slice User Slice of root.
Jun 21 12:01:01 localhost systemd: Started Session 256 of user root.
Jun 21 12:01:01 localhost systemd: Removed slice User Slice of root.
Jun 21 12:10:01 localhost systemd: Created slice User Slice of root.
Jun 21 12:10:01 localhost systemd: Started Session 257 of user root.
Jun 21 12:10:01 localhost systemd: Removed slice User Slice of root.
Jun 21 12:20:01 localhost systemd: Created slice User Slice of root.
Jun 21 12:20:01 localhost systemd: Started Session 258 of user root.
Jun 21 12:20:01 localhost systemd: Removed slice User Slice of root.
Jun 21 12:30:01 localhost systemd: Created slice User Slice of root.
Jun 21 12:30:01 localhost systemd: Started Session 259 of user root.
Jun 21 12:30:01 localhost systemd: Removed slice User Slice of root.
Jun 21 12:40:01 localhost systemd: Created slice User Slice of root.
Jun 21 12:40:01 localhost systemd: Started Session 260 of user root.
Jun 21 12:40:01 localhost systemd: Removed slice User Slice of root.
Jun 21 12:50:01 localhost systemd: Created slice User Slice of root.
Jun 21 12:50:01 localhost systemd: Started Session 261 of user root.
Jun 21 12:50:01 localhost systemd: Removed slice User Slice of root.
Jun 21 13:00:01 localhost systemd: Created slice User Slice of root.
http://www.lryc.cn/news/378683.html

相关文章:

  • 【达梦数据库】typeorm+node.js+达梦数据库返回自增列值
  • 【ARMv8/ARMv9 硬件加速系列 2.1 -- ARM NEON 向量寄存器单个元素赋值】
  • GD32学习
  • LangChain:如何高效管理 LLM 聊天历史记录?
  • 【React】useState 更新延迟的原因是什么,怎么解决?
  • 非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载百度网盘
  • jigdo无法下载的文件
  • C#面:C# 类的执行顺序?
  • 昇思25天学习打卡营第3天|数据集Dataset
  • SpringCloud 服务调用 spring-cloud-starter-openfeign
  • 基于Elementui组件,在vue中实现多种省市区前端静态JSON数据展示并支持与后端交互功能,提供后端名称label和id
  • 基于DPU的云原生裸金属网络解决方案
  • pip install镜像源(更新和换源)
  • 基础语法——组合与继承
  • openGauss开发者大会、华为云HDC大会举行; PostgreSQL中国技术大会7月杭州开启
  • 编译报错:No rule to make target xx/libcam.halmemory_intermediates/export_includes
  • 【备考指南】CDA Level Ⅰ 最全备考攻略
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 5G基站光纤连接问题(200分) - 三语言AC题解(Python/Java/Cpp)
  • 分层Agent
  • OS复习笔记ch11-1
  • Docker Compose 使用
  • KEIL5.39 5.40 fromelf 不能生成HEX bug
  • mongosh 和mongo 命令行连接MongoDB
  • DOM 改变节点
  • 【面试题分享】重现 string.h 库常用的函数
  • 6.21 移动语义与智能指针
  • Kimi还能对学术论文进行润色?我来教你!
  • 智汇云舟成为中煤集团中煤智能创新联盟成员单位
  • 【文心智能体大赛】迎接属于你的休闲娱乐导师!
  • AI:音乐创作的未来还是毁灭的序曲?