Linux14--文本处理之:sed、awk命令

1 Linux三剑客之sed

Stream Editor 流式编辑器,主要擅长对文件的编辑操作,是一次处理一行内容

1.可以事先定制好编辑文件的指令,可用于同一套规则处理多个文件

2.用于处理大文件

# sed vs vim
  1.sed可以把处理文件的规则事先写好,然后使用同一套规则编辑多个文件
    vim只能一个个文件打开编辑
    
  2.sed处理文件,一次只处理一行,即同一时间内存中只有文件的一行内容
    无论文件多大,都不会对内存造成过大的压力
    vim是一次性打开文件所有内容,到内存中。文件过大,内存有压力



# 1 格式
  sed 选项 '定位+命令' 文件路径
    
  标准输出 | sed 选项 '定位+命令'


# 2 选项
  -n 取消默认输出到屏幕,即不自动打印
  -r 支持扩展正则表达式
  -i 直接编辑文件     # 把输出到屏幕的内容,保存到文件,包含规则处理后的结果 + 默认输出的结果
  -i.bak 备份文件并原处编辑

 
# 3 定位
  行定位:
    1        :定位到第一行
    1,3      :从第1行到第3行
    $        :最后一行
    不写定位  :定位所有行
    
  正则表达式定位:
    /egon/    :包含egon的行
    /^egon/   :以egon开头的行 
    /egon$/   :以egon结尾的行
    
  数字+正则表达式定位:
    "1,8p"        代表打印 18"1,/egon/p"   代表打印 从第1行到首次匹配到/egon/的行
    
    
# 4 命令
  d      : 删除匹配行,并立即启用下一轮循环(下一行的匹配处理)
        
  p      : 打印匹配行的内容,追加到默认输出之后
    
  s///[替换标记]   : 查找替换,支持使用其它分隔符,s@@@,s###
    替换标记:
		g 行内全局替换
        i 忽悠大小写
		p 显示替换成功的行
		w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中
    
  # 命令可以用;号连接多条
    eg: 1d;3d;5d 代表 删除135

sed 案例

# 案例文件:a.txt 
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon


### 用法示例:p与d  打印与删除
# 1.默认输出  所有行的文件内容  == cat a.txt
sed '' a.txt 
    egon1111
    22222egon
    3333egon33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666egon6666egon666egon
    
# 2.不默认输出  所有行的文件内容
sed -n '' a.txt
  	空
  	
# 3.输出打印从第1行,直到含有xxx的行
sed -n '1,/xxx/p' a.txt  
    egon1111
    22222egon
    3333egon33333
    4444xxx44444
    
# 4.删除从第1行,直到含有xxx的行,会默认输出模式空间中 规则处理后的文件内容
sed '1,/xxx/d' a.txt   
	5555xxx55555xxxx555xxx
	6666egon6666egon666egon

# 5.删除从第1行、第3行、第5行
sed '1d;3d;5d' a.txt   
    22222egon
    4444xxx44444
    6666egon6666egon666egon



### 用法示例:s///g 查找替换
# 1.把所有行的所有egon都换成BIGEGON
sed 's/egon/BIGEGON/g' a.txt  
    BIGEGON1111
    22222BIGEGON
    3333BIGEGON33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666BIGEGON6666BIGEGON666BIGEGON
    
    
# 2.以egon开头的行中的egon换成GAGAGA
sed '/^egon/s/egon/GAGAGA/g' a.txt 
    GAGAGA1111
    22222egon
    3333egon33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666egon6666egon666egon
    
# 3.只把第6行的第一个egon换成BIGEGON,加上g代表行内全局替换
sed '6s/egon/BIGEGON/' a.txt
    egon1111
    22222egon
    3333egon33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666BIGEGON6666egon666egon
    
# 4.把1到3行的egon换成BIGEGON
sed '1,3s/egon/BIGEGON/g' a.txt 
    BIGEGON1111
    22222BIGEGON
    3333BIGEGON33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666egon6666egon666egon

# 5.把第2行的egon换成BIGEGON,并输出写入到 /root/b.txt
sed -n '2s/egon/BIGEGON/w /root/b.txt' a.txt


### 用法示例:sed也支持管道
cat a.txt | sed '1,5d'  
	6666egon6666egon666egon


# 注:
  加上-i选项,直接修改文件,通常会在调试完毕确保没有问题后再加-i选项

2 Linux三剑客之awk

awk主要用于处理有格式的文本,eg:/etc/passwd这种

事实上awk是一门编程语言,可以独立完成很强大的操作

# 0 工作流程/原理
awk -F: '{print $1,$3}' /etc/passwd
awk -F ':' '{print $1,$3}' /etc/passwd

  1.awk会读取文件的一行内容然后赋值给$0

  2.然后awk会以-F指定的 输入分隔符 将该行切分成n段,
    最多可以达到100段,第一段给$1,第二段给$2,依次次类推
    
  3.print输出该行的第一段和第三段,默认OFS以空格 分割

  4.重复步骤1,2,3直到文件内容读完

    
# 内置变量
  $0   一整行内容
  NR   记录号,等同于当前行的行号
  NF   以-F分隔符分隔后的 字段数量
    
  FS   输入字段分隔符,默认空白字符,一般需要加 -F,指定输入分隔符
  OFS  输出字段分隔符,默认是空格,一般需要加 -v OFS="#",指定输出分隔符

  FILENAME   当前文件名
    
    
# 1 格式
  awk 选项 'pattern{action}' 文件路径
    
  标准输出 | awk 选项 'pattern{action}'


# 2 选项
  -F 指定行输入分隔符  默认以空白字符分隔
  -v 指定内置变量的值  eg: -v OFS="#" 


# 3 模式 pattern   
  未指定:空模式,匹配每一行

  /正则/
    /正则/        # 该行内容匹配成功正则
    $1 ~ /正则/   # 第一段内容 与正则 匹配成功
    $1 !~ /正则/  # 第一段内容 与正则 没有匹配成功
    
  比较运算:
    NR >= 3 && NR <=5  # 行号为3到5   && 且  || 或
    $1 == "root"       # 第一段内容等于root
    
    $NF      每行分割后的最后一段
    $(NF-1)  每行分割后的倒数第二段

    
# 4 操作 action
  print $1,$3

awk案例

# 案例文件:a.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


# 1.打印 以':'分割后,以root为首的行,默认用空格分割拼接的 字段1、3  
awk -F: '/^root/{print $1,$3}' a.txt 
	root 0

# 2.打印 以':'分割后,以root为首的行,指定用'#'分割拼接的 字段1、3  
awk -F: -v OFS="#"  '/^root/{print $1,$3}' a.txt
awk -F: '/^root/{print $1,$3}' OFS="#"  a.txt
	root#0

# 3.打印 以':'分割后,第一段内容 与正则以d开头 匹配成功的,默认用空格分割拼接的 字段1、3 
awk -F: '$1 ~ /^d/{print $1,$3}' a.txt 
	daemon 2

# 4.打印 以':'分割后,第一段内容 与正则以d开头 匹配没成功的,默认用空格分割拼接的 字段1、3 
awk -F: '$1 !~ /^d/{print $1,$3}' a.txt 
    root 0
    bin 1
    adm 3
    lp 4

# 5.打印 以':'分割后,行号大于3 的字段1
awk -F: 'NR>3{print $1}' a.txt 
    adm
    lp

# 6.打印 以':'分割后,第一段内容等于"lp"的整行内容
awk -F: '$1 == "lp"{print $0}' a.txt 
	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


# 7.awk也支持管道
cat a.txt | awk -F: '{print $1}' 
    root
    bin
    daemon
    adm
    lp
posted @   Edmond辉仔  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-06-26 20--面向对象02:封装、隐藏属性、property装饰器
点击右上角即可分享
微信分享提示