Shell编程高级篇之字符截取和替换命令(cut、printf、awk)

请坐!

    • 字符截取和替换命令
      • cut命令
      • printf命令(动作)
      • awk命令
          • awk 预定义条件
          • awk 关系运算条件
          • awk 包含匹配关系
          • awk 内置变量
          • awk 的数值运算

字符截取和替换命令

在这里插入图片描述

cut命令

命令格式:cut +参数 +文件名

参数:
-f 列号:提取第几列,默认识别制表符分割出来的列
在这里插入图片描述
-d 分隔符:按照指定的分割符进行分割,然后结合-f提取指定列,如:-d “:” 表示以冒号为分隔符
在这里插入图片描述
-c 字符范围:不依赖分割符来分割,而是通过字符范围进行提取
n-m表示从第n提取到第m个字符
n-表示从第n个字符开始提取到结尾
-m表示从第一个字符提取到第m个
在这里插入图片描述

printf命令(动作)

printf是标准的逐行格式化输出,取消所有默认格式,然后手动指定输出内容的类型和输出时的格式

格式:printf +‘输出类型/格式’ +字符串
可以使用cat、head、tail等命令将文本内的字符串取出,然后交由printf处理

输出类型:
%s:将内容按照字符串类型输出
%i:将内容按照整数类型输出
%f:将内容按照浮点数类型输出(有四舍五入的功能)(%.2f:代表输出小数点数值时保留两位小数点)

输出格式:
\t:字符之间用制表符分割,即tab键
\n:字符之间用换行符分割,即enter键

在使用printf输出时,如果仅指定输出类型,而不指定输出格式,则会把所有要输出内容连在一起输出,变为一整行。而printf提供了可自定义的灵活的输出格式,若要将内容按照原格式输出,我们需要自己为printf写格式。

案例演示:
在这里插入图片描述
在这里插入图片描述

awk命令

注意事项:在awk编程中,因为命令语句非常长,输入格式时需要注意以下内容

  • 多个条件{动作}可以用空格分割
  • 在一个动作中,如果需要执行多个命令,需要用“;”分割
  • 在awk中,变量的赋值与调用都不需要使用“$”符 判断两个值是否相同,使用“==”,以便和变量赋值进行区分

awk命令:这里主要演示对文件的行提取列提取
格式:awk +‘条件1{动作1}’ +文件名

  1. 条件

针对行,通过指定条件过滤出符合条件的

  • 变量>10 :判断变量的是否大于10;可使用>、<、>=、<=等
  • 变量== 变量 :判断两个变量的值是否相等;可使用==、!=等
  • 变量~字符串 :判断变量中是否包含指定字符串,~ !~
  1. 动作

针对列,通过动作将符合条件的行打印出来,不过在打印时我们可以选择打印该行中的哪些

  • 我们结合printf命令使用
awk 预定义条件
  • 一定要大写!!!

BEGIN:在awk未读取数据前声明的条件,该条件后的动作仅在程序开始时只执行一次,不会重复执行
在这里插入图片描述

[root@localhost ~]# awk 'BEGIN{FS=":"}{printf $1"\t"$7"\n"}' /etc/passwd
root		/bin/bash
bin		/sbin/nologin
daemon	/sbin/nologin
adm		/sbin/nologin
lp		/sbin/nologin

END:类似于BEGIN,在awk处理完所有数据后声明的条件,在该条件后的程序仅在程序结束前执行一次
在这里插入图片描述

awk 关系运算条件
符号:>、<、>=、<=、==、!=

用来判断左右两侧的关系,一般左侧为变量右侧为参考值

在这里插入图片描述

例1:列出Linux成绩大于等于80分的成绩单
[root@localhost ~]# awk 'BEGIN{printf "列出Linux成绩大于等于80分的成绩单:\n"} $3>=80{printf $2"\t"$3"\n"}' cut.txt 
列出Linux成绩大于80分的成绩单:
NAME		LINUX
xcang	95
xbo		83

例2:列出学号为2号的各科成绩单
[root@localhost ~]# awk '$1==2{printf $0"\n"}' cut.txt
2	xlong	74	96	63
awk 包含匹配关系
符号:~、!~、~//、!~//

因为有包含匹配我们会结合正则来使用,所以养成习惯所有的匹配关系都加//

[root@localhost ~]# cat cuta.txt 
ID	NAME		LINUX	MYSQL	DOCKER	MAIL
0	xcang	95		59		78		xcang@163.com
1	xbo		83		75		93		boduo@126.com.cn
2	xlong	74		96		63		zeze@gmail.com

[root@localhost ~]# awk '$6~/x/{printf $0"\n"}' cuta.txt 
#$6是否包含x,包含x的行再进行动作
0	xcang	95	59	78	xcang@163.com

[root@localhost ~]# awk '/x/{printf $0"\n"}' cuta.txt 
#条件没有指定,所以是看一下所有的行是否包含x,包含了再进行动作
0	xcang	95	59	78	xcang@163.com
1	xbo		83	75	93	boduo@126.com.cn
2	xlong	74	96	63	zeze@gmail.com

[root@localhost ~]# awk '$0~/\.com$/{printf $0"\n"}' cuta.txt 
#判断所有的行是否以.com为结尾
0	xcang	95	59	78	xcang@163.com
2	xlong	74	96	63	zeze@gmail.com

[root@localhost ~]# df -h | awk '/(sd|sr)[a-z]?[0-9]/{printf $1"\t"$5"\n"}'
/dev/sr0		100%
/dev/sda1		15%

awk 内置变量
awk内置变量 作用
$0 代表awk读入当前行的整行数据
$n 代表awk读入当前行的第n列数据
NR 代表当前awk正在处理的行的行号
NF 代表当前awk读取数据总字段数(总列数)
FS 用来声明awk的分隔符,如BEGIN {FS=“:”}
-F 和FS功能一样
[root@localhost ~]# awk 'NR>1{printf $0"\n"}' a.txt 
0	xcang	95	59	78	xcang@163.com
1	xbo		83	75	93	boduo@126.com.cn
2	xlong	74	96	63	zeze@gmail.com

[root@localhost ~]# awk 'END{printf "文件的总列数为:"NF"\n"}' a.txt
文件的总列数为:6
#统计指定文件的最后一行的列数

[root@localhost network-scripts]# echo $PWD|awk -F "/" '{printf $NF"\n"}'
network-scripts
#打印以/为分割符号内容的最后一列,NF为3,$NF就是$3第三列
awk 的数值运算

awk中默认支持数值运算,并且整数、浮点数运算都支持
在这里插入图片描述
还可以通过给变量值的方式来运算:
在这里插入图片描述

你可能感兴趣的:(Shell高级篇)