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. 地址范围:   #,#      #从#行到第#行,36 从第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],......

 

posted @   goodbay说拜拜  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示