当前位置 : 主页 > 操作系统 > centos >

Linux 云计算集群架构师->第二十四章 shell 中色彩处理和 awk 使用技巧

来源:互联网 收集:自由互联 发布时间:2022-09-29
第二十四章 shell 中色彩处理和 awk 使用技巧 (上课时间2021-07-22,笔记整理时间2021-07-29) 本节所讲内容: 24.1 shell 中的色彩处理 24.2 awk 基本应用 24.3 awk 高级应用 24.1 Shell 中的色彩处理

第二十四章 shell 中色彩处理和 awk 使用技巧

(上课时间2021-07-22,笔记整理时间2021-07-29)

本节所讲内容:

24.1 shell 中的色彩处理

24.2 awk 基本应用

24.3 awk 高级应用

24.1 Shell 中的色彩处理

shell 脚本中 echo 显示内容带颜色显示,echo 显示带颜色,需要使用参数-e

格式 1: echo -e “\033[背景颜色;文字颜色 m 要输出的字符 \033[0m”

格式 2:echo -e “\e[背景颜色;文字颜色 m 要输出的字符\e[0m”

例:绿底蓝字

如图:

image-20210726185710681

[root@CentOS83 ~]# echo -e "\033[42;34m hello world\033[0m" hello world [root@CentOS83 ~]# echo -e "\e[42;34m hello world\e[0m" hello world

注:其中 42 的位置代表底色,34 的位置代表的是字的颜色,0m 是关闭属性

1、字背景颜色和文字颜色之间是英文的分号";"

2、文字颜色后面有个 m

3、字符串前后可以没有空格,如果有的话,输出也是同样有空格

4、echo 显示带颜色,需要使用参数-e ,-e 允许对下面列出的加反斜线转义的字符进行解释。

控制选项:

\033[0m 关闭所有属性

\033[1m 设置高亮度,加粗

\033[5m 闪烁

[root@CentOS83 ~]# echo -e "\e[42;34m hello world\e[5m" #执行后,发现后期所有输出都闪烁状态,如何关闭? [root@CentOS83 ~]# echo -e " \e[0m" #可以使用\e[0m 关闭所有属性 [root@CentOS83 ~]# echo -e " \033[0m" #可以使用\033[0m 关闭所有属性

image-20210726190230976

常见 shell 输入带颜色文字: 3x 代表字的颜色,4x 代表背景色 echo -e "\033[30m 黑色字 \033[0m" echo -e "\033[31m 红色字 \033[0m" echo -e "\033[32m 绿色字 \033[0m" echo -e "\033[33m 黄色字 \033[0m" echo -e "\033[34m 蓝色字 \033[0m" echo -e "\033[35m 紫色字 \033[0m" echo -e "\033[36m 天蓝字 \033[0m" echo -e "\033[37m 白色字 \033[0m" echo -e "\033[40;37m 黑底白字 \033[0m" echo -e "\033[41;37m 红底白字 \033[0m" echo -e "\033[42;37m 绿底白字 \033[0m" echo -e "\033[43;37m 黄底白字 \033[0m" echo -e "\033[44;37m 蓝底白字 \033[0m" echo -e "\033[45;37m 紫底白字 \033[0m" echo -e "\033[46;37m 天蓝底白字 \033[0m" echo -e "\033[47;30m 白底黑字 \033[0m"

shell 色彩应用实战:

[root@CentOS83 ~]# echo -e "\033[31m 开始部署apache环境 \033[0m" \ && yum -y install httpd &> /dev/null \ && systemctl start httpd \ && echo -e "\033[42m apache启动成功 \033[0m" || echo -e "\033[41m apache启动失败!\033[0m"

#安装服务,部署开始时输出红色字体。部署成功并启动服务后输出绿底 start 字样,失败则输出红底 error 字样。

24.2 awk 基本应用

grep 和 egrep:文本过滤的

sed:流编辑器,实现编辑的

awk:文本报告生成器,实现格式化文本输出

24.2.1 概念

AWK 是一种优良的文本处理工具,Linux 及 Unix 环境中现有的功能最强大的数据处理引擎之一。

这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk 命名:Alfred Aho Peter (阿尔弗雷德·霍彼得)、Weinberger(温伯格)和 brian kernighan(布莱恩·柯林汉)三个人的姓的缩写。

awk---->gawk 即: gun awk

在 linux 上常用的是 gawk,awk 是 gawk 的链接文件

man gawk----》pattern scanning and processing language 模式扫描和处理语言。

任何 awk 语句都是由模式和动作组成,一个 awk 脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。

模式:

正则表达式 : /root/ 匹配含有 root 的行 /*.root/

**关系表达式: < > && || + ***

匹配表达式: ~ !~

动作:

变量 命令 内置函数 流控制语句

它的语法结构如下:

awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }' file

其中:BEGIN END 是 AWK 的关键字部,因此必须大写;这两个部分开始块和结束块是可选的

image-20210726193356814

特殊模块:

BEGIN 语句设置计数和打印头部信息,在任何动作之前进行

END 语句输出统计结果,在完成动作之后执行

image-20210726202247105

通过上面我们可以知道;AWK 它工作通过三个步骤

1、读:从文件、管道或标准输入中读入一行然后把它存放到内存中

2、执行:对每一行数据,根据 AWK 命令按顺序执行。默认情况是处理每一行数据,也可以指定模式

3、重复:一直重复上述两个过程直到文件结束

AWK 支持两种不同类型的变量:内建变量,自定义变量

awk 内置变量:

字符 定义 $n 当前记录的第 n 个字段,比如: $1 表示第一个字段,$2 表示第二个字段 $0 这个变量包含执行过程中当前行的文本内容 FILENAME 当前输入的文件名 FS 字段分隔符(默认是空格) NF 表示字段数,在执行过程中对应于当前的字段数,NF:列的个数 FNR 各文件分别计数的行号 NR 表示记录数,在执行过程中对应于当前的行号 , NR :行号 OFS 输出字段分隔符(默认值是一个空格) ORS 输出记录分隔符(默认值是一个换行符) RS 记录分隔符(默认是一个换行符)

image-20210726205805963

24.2.2 实例演示

常用的命令选项:

-F fs 指定分隔符

-v 赋值一个用户自定义变量

-f 指定脚本文件,从脚本中读取 awk 命令

(1)分隔符的使用

用法:-Ffs 其中 fs 是指定输入分隔符,fs 可以是字符串或正则表达式;分隔符默认是空格

常见写法:-F: -F, -F[Aa]

[root@CentOS83 ~]# echo "AA BB CC DD" | awk '{print $2}' [root@CentOS83 ~]# echo "AA BB CC DD" | awk '{print $2}' BB [root@CentOS83 ~]# echo "AA|BB|CC|DD" | awk -F "|" '{print $2}' BB [root@CentOS83 ~]# echo "AA,BB,CC,DD" | awk -F "," '{print $2}' BB [root@CentOS83 ~]# echo "AA,BB,CC,DD" | awk -F , '{print $2}' BB [root@CentOS83 ~]# awk -F: '{print $1}' /etc/passwd root bin daemon ………… [root@CentOS83 ~]# cut -d: -f1 /etc/passwd root bin daemon ………… [root@CentOS83 ~]# echo "86AxAbADXaAD53" | awk -F "[aA]" '{print $1}' 86 #指定多个分隔符 [root@CentOS83 ~]# echo "86AxAbADXaAD53" | awk 'BEGIN {FS="aA"} {print $2}' D53 #使用 FS 指定分隔符 [root@CentOS83 ~]# ifconfig ens33 | grep netmask inet 10.170.80.83 netmask 255.255.255.0 broadcast 10.170.80.255 [root@CentOS83 ~]# ifconfig ens33 | grep netmask | awk '{print $2}' 10.170.80.83 #过滤出本系统的 IP 地址

(2)关系运算符的使用

[root@CentOS83 ~]# echo "5 6 7 9" > echo1.txt [root@CentOS83 ~]# awk '{print $1+10}' echo1.txt 15 [root@CentOS83 ~]# awk '{print $2+10}' echo1.txt 16 [root@CentOS83 ~]# echo "5 6 7 9" > echo1.txt [root@CentOS83 ~]# awk '{print $1+10}' echo1.txt 15 [root@CentOS83 ~]# awk '{print $2+10}' echo1.txt 16 [root@CentOS83 ~]# echo "one two three four" | awk '{print $4}' four [root@CentOS83 ~]# echo "one two three four" | awk '{print $NF}' four [root@CentOS83 ~]# echo "one two three four" | awk '{print $(NF-2)}' two ##打印倒数第3列 [root@CentOS83 ~]# echo "one two three four" | awk '{print $(NF/2-1)}' one

打印出 passwd 文件中用户 UID 小于 10 的用户名和它登录使用的 shell

参数: $NF 最后一列

[root@CentOS83 ~]# awk -F: '$3<10{print $1 $NF}' /etc/passwd root/bin/bash bin/sbin/nologin ………… [root@CentOS83 ~]# awk -F: '$3<10{print $1 "<======>" $NF}' /etc/passwd root<======>/bin/bash #awk 格式化输出 bin<======>/sbin/nologin ………… [root@CentOS83 ~]# awk -F: '$3<10{print $1 "\t" $NF}' /etc/passwd root /bin/bash #在$1 和$NF 之间加一下\t tab bin /sbin/nologin …………

注:awk 最外面使用了单引号'' ,里面都使用双引号“”

输出多个列时,可以加,分隔一下.

[root@CentOS83 ~]# awk -F: '$3<10{print $1,$NF}' /etc/passwd root /bin/bash bin /sbin/nologin …………

打印出系统中 UID 大于 1000 且登录 shell 是/bin/bash 的用户

[root@CentOS83 ~]# awk -F: '$3>=1000 && $NF=="/bin/bash"{print $1 "\t" $NF}' /etc/passwd dior /bin/bash which /bin/bash …………

(3)在脚本中的一些应用 例:统计当前内存的使用率

[root@CentOS83 ~]# vim user_cache.sh [root@CentOS83 ~]# cat user_cache.sh #!/bin/bash echoo "当前系统内存使用百分比为:" USEFREE=`free -m | grep -i mem | awk '{print $3/$2*100"%"}'` echo -e "内存使用百分比: \e[31m${USEFREE}\e[0m" [root@CentOS83 ~]# bash user_cache.sh user_cache.sh: line 2: echoo: command not found ÄÚ´æʹÓðٷֱȣº 37.407%

image-20210727202215800

24.3 awk 高级应用

命令格式:awk [-F | -f | -v ] ‘BEGIN {} / / {command1;command2} END {}’ filename

参数 意义 -F 指定分隔符 -f 调用脚本 ‘{}’ 引用代码块 {…} 命令代码块,包含一条或多条命令 BEGIN 初始化代码块 {print A;print B} 多条命令使用分号分隔 END 结尾代码块

在 awk 中,pattern 有以下几种:

empty 空模式,这个也是我们常用的

/regular expression/ 仅处理能够被这个模式匹配到的行

#打印以 dior 开头的行 [root@CentOS83 ~]# awk -F: '/^dior/{print $0}' /etc/passwd dior:x:1000:1000::/home/dior:/bin/bash

3) 行范围匹配 startline,endline

#输出行号大于等于 5 且行号小于等于 10 的行 [root@CentOS83 ~]# awk -F: '(NR>=5&&NR<=10){print NR,$0}' /etc/passwd 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin

内置变量的特殊用法:

字符 含义 $0 表示整个当前行 NF 字段数量 NF(Number 数量 ; field 字段) ;NF:列的个数 NR 每行的记录号,多文件记录递增 Record [ˈrekɔ:d] NR :行号 \t 制表符 \n 换行符 ~ 匹配 !~ 不匹配 -F'[:#/]+' 定义三个分隔符

使用 NR 行号来定位,然后提取 IP 地址

注:这个思路很好,之前都是通过 过滤关键字来定位,这次是通过行号,多了一种思路

[root@CentOS83 ~]# ifconfig ens33 | awk 'NR==2{print $2}' 10.170.80.83

注:NR==2 表示行号为第 2 行

NR 与 FNR 的区别

[root@CentOS83 ~]# awk '{print NR"\t"$0}' /etc/hosts /etc/hostname 1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 3 10.170.80.80 centos83 4 10.170.80.81 centos81 5 10.170.80.82 centos82 6 10.170.80.83 centos83 7 10.170.80.84 centos85 8 10.170.80.85 centos86 9 CentOS83 [root@CentOS83 ~]# awk '{print FNR"\t" $0}' /etc/hosts /etc/hostname 1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 3 10.170.80.80 centos83 4 10.170.80.81 centos81 5 10.170.80.82 centos82 6 10.170.80.83 centos83 7 10.170.80.84 centos85 8 10.170.80.85 centos86 1 CentOS83

注:对于 NR 来说,在读取不同的文件时,NR 是一直加的 ; 对于 FNR 来说,在读取不同的文件时,它读取下一个文件时,FNR 会从 1 开始重新计算的

#:使用 3 种方法去除首行 [root@CentOS83 ~]# route -n | grep -v Kernel Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.170.80.1 0.0.0.0 UG 100 0 0 ens33 10.170.80.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 方法 2:sed 1d #删除第 1 行的内容 [root@CentOS83 ~]# route -n | sed 1d 方法 3: awk [root@CentOS83 ~]# route -n | awk 'NR!=1 {print $0}'

匹配,使用 awk 查出以包括 root 字符的行 , 有以下 3 种方法

[root@CentOS83 ~]# awk -F: '/root/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@CentOS83 ~]# awk -F: '/root/' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@CentOS83 ~]# awk -F: '/root/{print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

做一个不匹配 root 行:

[root@CentOS83 ~]# awk -F: '!/root/{print $0}' /etc/passwd

以 bash 结尾的行:

[root@CentOS83 ~]# awk -F: '/bash$/{print $0}' /etc/passwd

总结:

24.1 shell 中的色彩处理

24.2 awk 基本应用

24.3 awk 高级应用

网友评论