Linux三剑客-sed与awk

一、三剑客-sed命令

1、格式

sed + '找谁干啥' + 文件

sh 复制代码
找谁:条件,匹配哪一行,哪些行.
干啥:动作,增删改查.
#显示文件的第3行
sed -n '3p' /etc/passwd
选项 说明
-n 取消默认输出
-p 查找
-r sed支持扩展正则
-i 修改文件内容,这个选项放在最后
-i.bak 先进行备份,然后修改文件内容,这个选项放在最后

2、如何运行

3、sed之查找

一种是类似于grep模糊查找. 一种是精确查找,行号.

  • 类似于grep命令的过滤,比grep强在于可以指定行号,
  • 类似于grep命令的功能,模糊查询(通过正则).

案例01:取出文件的第3行

-n表示取消默认输出,sed处理文件的时候会默认的输出每一行内容

sh 复制代码
sed -n '3p' /etc/passwd

案例02:取出/etc/passwd的第2行到第5行

sh 复制代码
sed -n '2,5p' /etc/passwd

案例03:过滤出/etc/passwd中包含root的行

sh 复制代码
sed -n '/root/p' /etc/passwd
cat /etc/passwd | grep root
#如果是以root开头呢
sed -n '/^root/p' /etc/passwd

sed进行过滤的时候需要使用//并且里面支持基础正则 如果需要使用扩展正则需要使用sed -r选项

案例04:获取范围内的日志

sh 复制代码
#sed -n '/从哪里来/,/到哪里去/p' tx.txt
sed -n '/102/,/104/p' tx.txt

案例05:只显示第3行和第5行

sh 复制代码
sed -n '3p;5p' /etc/passwd

案例06:表示有规律查找

sh 复制代码
 [root@nanjing ~]# seq 10 | sed -n '1~2p'
1
3
5
7
9
[root@nanjing ~]# seq 10 | sed -n '2~2p'
2
4
6
8
10

4、sed之修改

sed命令替换格式

sed 's#找谁#替换成什么#g' tx.txt

推荐使用:###,@@@,///

s substitute 替换 sub

g global 全局替换,这一行中把所有匹配到的内容都进行替换,否则只替换每一行第1个匹配的内容

修改文件内容

-i确认修改

修改文件内容之前进行备份,然后修改文件内容

sh 复制代码
sed -i.bak 's#js#xp#g' tx.txt

一般用于替换某一个文件,如果是多个文件就打包压缩进行备份即可

后向引用格式

sed命令中用于处理列的方式:

使用替换的形式 s###g

前2个井号之间通过正则与(),对数据进行分组

后面2个井号之间通过\数字,去调用前面分组的内容

sh 复制代码
#输出12345678,通过sed加工变成1<234567>8
[root@nanjing ~]# echo {1..8} | sed -r 's#(1)(.*)(8)#\1<\2>\3#g'
1< 2 3 4 5 6 7 >8

案例01:调换/etc/passwd第1列和最后一列内容

sh 复制代码
sed -r 's#(^.*)(:x.*:)(.*$)#\3\2\1#g' passwd 

案例02:取出网卡ip地址

sh 复制代码
ip a s eth0 | sed -n '3p'  | sed -r 's#^.*et ([0-9.]+)/.*$#\1#g'

5、sed之删除

d delete 删除sed命令删除功能按照行为单位进行

如果仅仅删除某一行的一些字符推荐使用's#[a-z]##g'

排除/删除文件中的空行和带注释的行

sh 复制代码
egrep -v '^$|^#' sshd_config
sed -r '/^$|^#/d' sshd_config
awk '! /^$|^#/' sshd_config

6、sed之增加

cai

  • a append 在指定行后面追加内容
  • i insert 在指定行上面插入一行
  • c replace 替换指定行的内容
sh 复制代码
[root@nanjing ~]# cat tx.txt
101,shi,CEO
102,wu,CTO
103,bo,COO
104,js,CFO
105,time,CIO
110,gege,COCO
[root@nanjing ~]# sed '3a tianjia' tx.txt
101,shi,CEO
102,wu,CTO
103,bo,COO
tianjia
104,js,CFO
105,time,CIO
110,gege,COCO
[root@nanjing ~]# cat tx.txt
101,shi,CEO
102,wu,CTO
103,bo,COO
104,js,CFO
105,time,CIO
110,gege,COCO
#只要不保存,就不加一个 -i

7、总结

二、三剑客-awk命令

四剑客 特点 擅长
find 查找文件 查找文件,与其他命令配合
grep/egrep 过滤 过滤速度很快
sed 过滤,取行,替换,删除 替换,修改文件内容,取行
awk 过滤,取行,取列,统计计算,判断,循环...... 取行,取列,统计计算

1、格式

sh 复制代码
#取出/etc/passwd中的第1行的第1列,第3列和最后一列
awk -F: 'NR =1{print $1,$3,$NF}' /etc/passwd
awk 选项 '条件{动作}' /etc/passwd
#条件 找谁
#动作 干啥

2、执行流程

3、取行

案例一:取出/etc/passwd的第1行

sh 复制代码
[root@nanjing ~]# awk 'NR==1' /etc/passwd
[root@nanjing ~]# awk 'NR==1{print $0} ' /etc/passwd
root:x:0:0:root:/root:/bin/bash

NR Number of Record 记录号,行号

== 表示等于

{print $0} 输出整行内容 $0表示当前行的内容、awk满足条件后默认的动作,输出这一行的内容

案例二:取出/etc/passwd的第2行到第5行的内容

sh 复制代码
awk 'NR>=2 && NR<=5' /etc/passwd

>= 表示大于等于

&& 表示并且

|| 表示或者

awk常用运算符 说明
== 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
&& 并且
| | 或者

案例三:过滤出/etc/passwd文件中包含root或nobody的行

sh 复制代码
awk '/root/ || /nobody/' /etc/passwd
awk '/root|nobody/' /etc/passwd

案例四:从包含root的行到包含nobody的行

sh 复制代码
awk '/root/,/nobody/' /etc/passwd

4、取列

案例一:使用awk取出 ls -lh 的大小列和最后一列

sh 复制代码
 ls -lh | awk '{print $5,$9}'| column -t

awk中取列的时候说明:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> 数字 , 表示取列 , 数字,表示取列, </math>数字,表示取列,1 第1列; $0表示这一行.
  • $NF 最后一列
  • NF Number of Field 每行有多少列
  • $(NF-1) 取出倒数第2列,一般用于正向取发生变化或数字过大.

awk输出与对齐:

  • 使用column -t 命令即可或者使用 \t

案例二:取出/etc/passwd中的第1列,第3列和最后一列

awk取列的时候,默认是通过空白字符进行分割的.

空白字符:空格,连续空格,tab键.

但是一些时候使用默认分隔符不够了,需要我们手动指定分隔符,通过-F选项指定. 未来我们想快速取出想要的内容,选择趁手工具(选好分隔符).

选择分隔符建议: 看你目标两边是啥

sh 复制代码
awk -F':'  '{print$1,$3,$NF}' /etc/passwd | column -t

案例三:指定复杂分隔符取出 ip

sh 复制代码
ip a s eth0 | awk 'NR==3'| awk '{print $2}' | awk -F '/' '{print$1}'
#不加-F指定分隔符,按照直意理解
ip a s eth0 | awk -F '[ /]' 'NR==3{print $6}'
ip a s eth0 | awk -F '[ /]+' 'NR==3{print $3}'
#+号 连续的空格

5、取行和取列

awk 格式'条件{动作}

案例一:取行+取列 取ip地址

sh 复制代码
ip a s eth0 | awk -F '[ /]+' 'NR==3{print $3}'

案例二:取出权限部分 stat /etc/hosts的0644部分

sh 复制代码
stat /etc/hosts | awk -F '[(/]' 'NR==4{print $2}'

案例三:取出/etc/passwd文件中第3列大于100的行,取出这行的第1列,第3列和最后列

sh 复制代码
awk -F ':' '$3>=1000{print $1,$3,$NF}' /etc/passwd | column -t

通过awk实现对某一列进行判断,然后进行提取.

案例四:如果系统swap使用超过0则输出"异常系统开始占用swap

sh 复制代码
free | awk 'NR==3 && $3>0{print "异常系统开始占用swap"}'

案例五:过滤出/etc/passwd第4列的数字是以0或1开头的行,输出第1列,第3列,第4列

sh 复制代码
awk -F ':' '$4~/^[01]/{print $1,$3,$4}' /etc/passwd

温馨提示 awk中 通过~可以实现对某一列进行过滤 某一列中含有xxxx内容

  • ~ 表示包含的意思 $1 ~ /root/ 表示第1列中包含root
  • !~表示不包含

6、awk的统计与计算

awk进行统计有2类案例:

  • 类似于wc -l统计次数.
  • 进行求和,累加.

案例一:统计次数

sh 复制代码
[root@nanjing ~]# awk '{i=i+1} END{print i}' /etc/passwd
30
[root@nanjing ~]# cat /etc/passwd | wc -l
30

END{}内容会在awk读取完成文件的时候执行.

END{}一般用于输出执行结果.

i=i+1 === i++

案例二:计算总和

seq 10 > num.txt计算num.txt每一行的数字的总和

sh 复制代码
[root@nanjing ~]# awk '{i=i+$1}END{print i}' num.txt
55
相关推荐
州周18 分钟前
Ftp目录整个下载
linux·服务器·数据库
Jackey_Song_Odd19 分钟前
Ubuntu 24.04.1 解决部分中文字符(门、径)显示错误的问题
linux·ubuntu
kaixin_learn_qt_ing31 分钟前
Linux export命令
linux
余额不足1213834 分钟前
C语言基础十六:枚举、c语言中文件的读写操作
linux·c语言·算法
冷曦_sole38 分钟前
linux-19 根文件系统(一)
linux·运维·服务器
AI大模型学徒41 分钟前
Linux(二)_清理空间
linux·运维·服务器
云川之下1 小时前
【linux】 unshare -user -r /bin/bash命令详解
linux·bash·unshare
热心市民运维小孙1 小时前
Ubuntu重命名默认账户
linux·ubuntu·excel
Jackey_Song_Odd2 小时前
解决Ubuntu下无法装载 Windows D盘的问题
linux·ubuntu
乔巴不是狸猫2 小时前
第11周作业
linux