Linux文本处理三剑客
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行 模式:由正则表达式字符及文本字符所编写的过滤条件
格式:
grep [OPTIONS] PATTERN [FILE...]
常见选项
-color=auto 对匹配到的文本着色显示 -m # 匹配#次后停止 -v 显示不被pattern匹配到的行,即取反 -i 忽略字符大小写 -n 显示匹配的行号 -c 统计匹配的行数 -o 仅显示匹配到的字符串 -q 静默模式,不输出任何信息 -A # after, 后#行 -B # before, 前#行 -C # context, 前后各#行 -e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file -w 匹配整个单词 -E 使用ERE,相当于egrep -F 不支持正则表达式,相当于fgrep -f file 根据模式文件处理 -r 递归目录,但不处理软链接 -R 递归目录,但处理软链接
分区利用率最大的值
[root@centos8 ~]#df | grep '^/dev/sd' |tr -s ' ' %|cut -d% -f5|sort -n|tail -1 [root@centos8 ~]#df |grep '^/dev/sd' |grep -oE '\<[0-9]{,3}%'|tr -d '%'|sort -nr|head -n1 [root@centos8 ~]#df |grep '^/dev/sd' |grep -oE '\<[0-9]{,3}%'|grep -Eo '[0-9]+'|sort -nr|head -n1 13
哪个IP和当前主机连接数最多的前三位
[root@centos8 ~]#ss -nt | grep "^ESTAB" |tr -s ' ' : |cut -d: -f6|sort |uniq -c|sort -nr|head -n3 3 10.0.0.1 1 172.16.4.100 1 172.16.31.188
连接状态的统计
[root@wang-liyun-pc ~]# ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c 7 ESTAB 4 LISTEN 7 TIME-WAIT [root@wang-liyun-pc ~]# ss -nta | tail -n +2 |cut -d" " -f1|sort |uniq -c 3 ESTAB 4 LISTEN 12 TIME-WAIT
2、文本处理之sed
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到 最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
2.1.1 sed 基本用法
格式
sed [option]... 'script;script;...' [inputfile...]
常用选项
-n 不输出模式空间内容到屏幕,即不自动打印 -e 多点编辑 -f FILE 从指定文件中读取编辑脚本 -r, -E 使用扩展正则表达式 -i.bak 备份文件并原处编辑 -s 将多个文件视为独立文件,而不是单个连续的长文件流
#说明: -ir 不支持 -i -r 支持 -ri 支持 -ni 会清空文件
script格式
'地址命令'
地址格式
1. 不给地址:对全文进行处理 2. 单地址: #:指定的行,$:最后一行 /pattern/:被此处模式所能够匹配到的每一行
3. 地址范围: #,# #从#行到第#行,3,6 从第3行到第6行 #,+# #从#行到+#行,3,+4 表示从3行到第7行 /pat1/,/pat2/ #正则表达式
#,/pat/
/pat/,#
4. 步进:~ 1~2 奇数行 2~2 偶数行
命令:
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
q 结束或退出sed
查找替代
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s### 替换修饰符: g 行内全局替换 p 显示替换成功的行 w /PATH/FILE 将替换成功的行保存至文件中 I,i 忽略大小写
示例:
[11:20:54 root@centos8 ~]#sed ' ' /etc/issue \S Kernel \r on an \m [11:21:00 root@centos8 ~]#sed -n ' ' /etc/issue [11:21:07 root@centos8 ~]#sed 'p' /etc/issue \S \S Kernel \r on an \m Kernel \r on an \m [11:21:16 root@centos8 ~]#sed -n 'p' /etc/issue \S Kernel \r on an \m [11:21:59 root@centos8 ~]#sed -n '1p' /etc/issue \S [11:22:10 root@centos8 ~]#sed -n '2p' /etc/issue Kernel \r on an \m
[11:26:51 root@centos8 ~]#ifconfig ens160| sed '2p' ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.85 netmask 255.255.255.0 broadcast 192.168.1.255 inet 192.168.1.85 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::f54:7ac3:581e:c117 prefixlen 64 scopeid 0x20<link> inet6 2409:8a20:be61:7a20:199e:9165:442b:2982 prefixlen 64 scopeid 0x0<global> ether 00:0c:29:0b:7c:79 txqueuelen 1000 (Ethernet) RX packets 22528 bytes 15943619 (15.2 MiB) RX errors 0 dropped 1468 overruns 0 frame 0 TX packets 8950 bytes 784348 (765.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [11:27:09 root@centos8 ~]#ifconfig ens160| sed -n '2p' inet 192.168.1.85 netmask 255.255.255.0 broadcast 192.168.1.255
不显示注释行和空行
[11:35:58 root@centos8 ~]#sed '/^#/d;/^$/d' /etc/fstab UUID=7a405199-a904-4290-89a3-72992b4ad489 / xfs defaults 0 0 UUID=6c58d4aa-0c80-4e0b-b372-0a2187033d23 /boot ext4 defaults 1 2 UUID=2dd6f870-9df8-47ec-a4fc-b8a01878f4e0 /data xfs defaults 0 0 UUID=27f69466-124d-4124-aab8-85f247d76d57 none swap defaults 0 0 [11:36:03 root@centos8 ~]#cat /etc/fstab # # /etc/fstab # Created by anaconda on Tue Apr 5 08:42:34 2022 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # UUID=7a405199-a904-4290-89a3-72992b4ad489 / xfs defaults 0 0 UUID=6c58d4aa-0c80-4e0b-b372-0a2187033d23 /boot ext4 defaults 1 2 UUID=2dd6f870-9df8-47ec-a4fc-b8a01878f4e0 /data xfs defaults 0 0 UUID=27f69466-124d-4124-aab8-85f247d76d57 none swap defaults 0 0 [11:36:15 root@centos8 ~]#
使用 -i 选项 直接 修改文本内容,最好-i.bak 备份修改 [11:38:40 root@centos8 ~]#sed -i '/^#/d;/^$/d' /etc/fstab [11:38:51 root@centos8 ~]#cat /etc/fstab UUID=7a405199-a904-4290-89a3-72992b4ad489 / xfs defaults 0 0 UUID=6c58d4aa-0c80-4e0b-b372-0a2187033d23 /boot ext4 defaults 1 2 UUID=2dd6f870-9df8-47ec-a4fc-b8a01878f4e0 /data xfs defaults 0 0 UUID=27f69466-124d-4124-aab8-85f247d76d57 none swap defaults 0 0 [11:39:01 root@centos8 ~]#
示例:搜索替换和&
[11:39:01 root@centos8 ~]#sed -nr 's#U..D#&name#gp' /etc/fstab UUIDname=7a405199-a904-4290-89a3-72992b4ad489 / xfs defaults 0 0 UUIDname=6c58d4aa-0c80-4e0b-b372-0a2187033d23 /boot ext4 defaults 1 2 UUIDname=2dd6f870-9df8-47ec-a4fc-b8a01878f4e0 /data xfs defaults 0 0 UUIDname=27f69466-124d-4124-aab8-85f247d76d57 none swap defaults 0 0 [11:50:19 root@centos8 ~]#
示例:去文件的前缀和后缀
[12:03:53 root@centos8 ~]#echo a.b.c.gz | sed -En 's/(.*)\.([^.]+)$/\1/p' a.b.c [12:08:20 root@centos8 ~]#echo a.b.c.gz | sed -En 's/(.*)\.([^.]+)$/\2/p' gz 将非#开头的行加# [12:09:25 root@centos8 ~]#sed -rn "s/^[^#]/#&/p" /etc/fstab #UUID=7a405199-a904-4290-89a3-72992b4ad489 / xfs defaults 0 0 #UUID=6c58d4aa-0c80-4e0b-b372-0a2187033d23 /boot ext4 defaults 1 2 #UUID=2dd6f870-9df8-47ec-a4fc-b8a01878f4e0 /data xfs defaults 0 0 #UUID=27f69466-124d-4124-aab8-85f247d76d57 none swap defaults 0 0
3、文本处理之awk
gawk:模式扫描和处理语言,可以实现下面功能
- 文本处理
- 输出格式化的文本报表
- 执行算数运算
- 执行字符串操作
格式:
awk [options] 'program' var=value file… awk [options] -f programfile var=value file…
program通常是被放在单引号中,并可以由三种部分组成
- BEGIN语句块
- 模式匹配的通用语句块
- END语句块
常见选项:
- -F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
- -v var=value 变量赋值
动作print
格式:
print item1, item2, ...
- 逗号分隔符
- 输出item可以字符串,也可是数值;当前记录的字段、变量或awk的表达式
- 如省略item,相当于print $0
- 固定字符需要用" " 引起来,而变量和数字不需要
[root@centos8~]$df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 980100 0 980100 0% /dev tmpfs 998536 0 998536 0% /dev/shm tmpfs 998536 8912 989624 1% /run tmpfs 998536 0 998536 0% /sys/fs/cgroup /dev/sda2 104806400 4922212 99884188 5% / /dev/sda5 52403200 398400 52004800 1% /data /dev/sda1 999320 177712 752796 20% /boot /dev/sr0 9046654 9046654 0 100% /mnt/cdrom tmpfs 199704 0 199704 0% /run/user/0 [root@centos8~]$df |awk '{print $1,$5}' Filesystem Use% devtmpfs 0% tmpfs 0% tmpfs 1% tmpfs 0% /dev/sda2 5% /dev/sda5 1% /dev/sda1 20% /dev/sr0 100% tmpfs 0%
取 ifconfig 输出结果中的IP地址
[root@centos8~]$ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.88 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::250:56ff:fe33:298d prefixlen 64 scopeid 0x20<link> ether 00:50:56:33:29:8d txqueuelen 1000 (Ethernet) RX packets 1624 bytes 172562 (168.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1419 bytes 90960 (88.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@centos8~]$ifconfig eth0 | awk '/netmask/{print $2}' 10.0.0.88 [root@centos8~]$ifconfig eth0| sed -rn '2s/^[^0-9]+([0-9.]+) .*$/\1/p' 10.0.0.88
文件host_list.log 如下格式,请提取”.magedu.com”前面的主机名部分并写入到回到该文件中
[root@centos8~]$cat host_list.log 1 www.magedu.com 2 blog.magedu.com 3 study.magedu.com 4 linux.magedu.com 5 python.magedu.com
[root@centos8~]$awk -F"[ .]" '{print $2}' host_list.log >> host_list.log [root@centos8~]$cat host_list.log 1 www.magedu.com 2 blog.magedu.com 3 study.magedu.com 4 linux.magedu.com 5 python.magedu.com www blog study linux python
awk变量
awk中的变量分为:内置和自定义变量
常见的内置变量
- FS:输入字段分隔符,默认为空白字符,功能相当于-F
-F 和 FS变量功能一样,同时使用会冲突
-F 和 FS变量功能一样,同时使用会 -F 优先级高
awk -v FS=':' '{print $1,FS,$3}' /etc/passwd awk -v FS=":" '{print $1FS$3}' /etc/passwd awk –F: '{print $1,$3,$7}' /etc/passwd
S=:;awk -v FS=$S '{print $1FS$3}' /etc/passwd
[root@centos8~]$awk -v FS=":" '{print $1FS$3}' /etc/passwd |head -4 root:0 bin:1 daemon:2 adm:3
- OFS:输出字段分隔符,默认为空白字符
[root@centos8~]$awk -v FS=":" '{print $1,$3,$7}' /etc/passwd |head -4 root 0 /bin/bash bin 1 /sbin/nologin daemon 2 /sbin/nologin adm 3 /sbin/nologin [root@centos8~]$awk -v FS=":" -v OFS=":" '{print $1,$3,$7}' /etc/passwd |head -4 root:0:/bin/bash bin:1:/sbin/nologin daemon:2:/sbin/nologin adm:3:/sbin/nologin
- RS:输入记录record分隔符,指定输入时的换行符
[root@centos8~]$cat /etc/passwd | head -4 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 [root@centos8~]$awk -v RS=':' '{print }' /etc/passwd |head -4 root x 0 0
- ORS:输出记录分割符,输出时用指定符号代替换行符
[root@centos8~]$awk -v RS=':' -v ORS='--' '{print $0 }' /etc/passwd |head -4 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
- NF字段数量
应用变量时,变量前不需要加$
[root@centos8~]$df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 980100 0 980100 0% /dev tmpfs 998536 0 998536 0% /dev/shm tmpfs 998536 8912 989624 1% /run tmpfs 998536 0 998536 0% /sys/fs/cgroup /dev/sda2 104806400 4922224 99884176 5% / /dev/sda5 52403200 398400 52004800 1% /data /dev/sda1 999320 177712 752796 20% /boot /dev/sr0 9046654 9046654 0 100% /mnt/cdrom tmpfs 199704 0 199704 0% /run/user/0 [root@centos8~]$df |awk '{print NF}' 7 6 6 6 6 6 6 6 6 6
取倒数第二列和最后一列
[root@centos8~]$df |awk '{print $(NF-1)}' Mounted 0% 0% 1% 0% 5% 1% 20% 100% 0% [root@centos8~]$df |awk '{print $(NF)}' on /dev /dev/shm /run /sys/fs/cgroup / /data /boot /mnt/cdrom /run/user/0
- NR:记录的编号
[root@centos8~]$awk '{print NR,$0}' /etc/fstab 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Mon Apr 18 10:31:22 2022 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk/'. 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. 8 # 9 # After editing this file, run 'systemctl daemon-reload' to update systemd 10 # units generated from this file. 11 # 12 UUID=578e255d-d098-4f3c-8723-be0ec693dc82 / xfs defaults 0 0 13 UUID=d1918dd5-8b34-47ee-8b82-bf0af3f171a8 /boot ext4 defaults 1 2 14 UUID=0b950f5b-2bce-49a3-940b-d21f4519503b /data xfs defaults 0 0 15 UUID=03bc96b3-1bf4-4e88-be0f-48e845b82855 none swap defaults 0 0 16 UUID=2020-11-18-21-39-52-00 /mnt/cdrom iso9660 defaults 0 0
取ifconfig输出结果中的IP地址
[root@centos8~]$ifconfig eth0 | awk 'NR==2{print $2}' 10.0.0.88
- FNR各文件分别计数,记录的编号
[root@centos8~]$awk '{print NR,$0}' /etc/issue /etc/redhat-release 1 \S 2 Kernel \r on an \m 3 4 CentOS Linux release 8.5.2111 [root@centos8~]$awk '{print FNR,$0}' /etc/issue /etc/redhat-release 1 \S 2 Kernel \r on an \m 3 1 CentOS Linux release 8.5.2111
- FILENAME:当前文件名
[root@centos8~]$awk '{print FILENAME,$0}' /etc/issue /etc/issue \S /etc/issue Kernel \r on an \m /etc/issue
- ARGC命令行参数的个数
[root@centos8~]$awk '{print ARGC}' /etc/issue /etc/redhat-release 3 3 3 3 [root@centos8~]$awk 'BEGIN{print ARGC}' /etc/issue /etc/redhat-release 3
- ARGV:数组,保存的是命令行所给定的各参数,每一个参数:ARGV[0],......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)