RHCE——十九、shell编程之awk

RHCE

      • 一、概念
      • 二、工作流程
        • 1、如图
        • 2、流程
      • 三、awk程序执行方式
        • 1、通过命令行执行awk程序
        • 2、awk命令调用脚本执行
        • 3、直接使用awk脚本文件调用
      • 四、awk命令的基本语法
        • 1、格式
        • 2、BEGIN模式与END模式
        • 3、awk的输出
      • 五、记录和域
        • 1、概念
        • 2、示例
        • 3、使用-F参数指定域之间的间隔符
        • 4、使用系统内置变量FS改变域分隔符
        • 5、NR、NF、FILENAME变量
      • 六、awk的变量
        • 1、概念
        • 2、内置变量
        • 3、示例
        • 4、用户自定义变量
      • 七、awk操作符
        • 1、算术运算符
        • 2、赋值运算符
        • 3、条件运算符
        • 4、逻辑运算符
        • 5、关系运算符
        • 6、其它运算符
      • 八、awk的模式
        • 1、关系表达式
        • 2、正则表达式
        • 3、混合模式
        • 4、BEGIN模式与END模式
      • 九、awk控制语句
        • 1、if语句
        • 2、fox循环
        • 3、while循环
        • 4、break、continue语句
        • 5、next语句
        • 6、exit
      • 十、格式化输出
        • 1、格式
        • 2、format
        • 3、注意
        • 4、示例
      • 十一、awk数组
        • 1、索引数组
        • 2、关联数组
        • 3、循环遍历数组
        • 4、利用数组统计字符串出现次数
      • 十二、实战

一、概念

  • awk是Linux以及UNIX环境中现有的功能最强大的数据处理工具,awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母

  • awk是一种处理文本数据的编程语言,适合文本处理和报表生成,awk的设计使得它非常适合于处理由行和列组成的文本数据。

  • awk 还是一种编程语言环境,它提供了正则表达式的匹配,流程控制,运算符,表达式,变量以及函数等一系列的程序设计语言所具备的特性,它从C语言中获取了一些优秀的思想

二、工作流程

1、如图

image-20230207093838609

2、流程

  • 第一步:自动从指定的数据文件中读取行文本。
  • 第二步:自动更新awk的内置系统变量的值,例如列数变量NF、行数变量NR、行变量$0以及各个列变量$1、$2等等
  • 第三步:依次执行程序中所有的匹配模式及其操作
  • 第四步:当执行完程序中所有的匹配模式及其操作之后,如果数据文件中仍然还有为读取的数据行,则返回到第(1)步,重复执行(1)~(4)的操作。

三、awk程序执行方式

1、通过命令行执行awk程序

  • 任何awk语句都由模式(pattern)和动作(action)组成
    • 模式:由一组用于测试输入行是否需要执行动作的规则
    • 动作:包含语句,函数和表达式的执行过程
    • 简言之,模式决定动作何时触发和触发事件,动作执行对输入行的处理
[root@server ~]# vim  input # 输入多个回车
[root@server ~]# awk  '/^$/{print  "This is a blank line."}'  input

2、awk命令调用脚本执行

  • 在awk程序语句比较多的情况下,用户可以将所有的语句写在一个脚本文件中,然后通过awk命令来解释并执行其中的语句。awk调用脚本的语法如下
awk -f program-file  file 
  • -f选项表示从脚本文件中读取awk程序语句,program-file表示awk脚本文件名称,file表示要处理的数据文件

[root@server ~]# vim scr.awk  # 输入以下内容
/^$/{print  "This is a blank line."}
[root@server ~]# awk -f  scr.awk  input  # 使用命令及脚本结合的方法执行
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.

3、直接使用awk脚本文件调用

  • 在上面介绍的两种方式中,用户都需要输入awk命令才能执行程序。除此之外,用户还可以通过类似于Shell脚本的方式来执行awk程序。在这种方式中,需要在awk程序中指定命令解释器,并且赋予脚本文件的可执行权限。其中指定命令解释器的语法如下
#!/bin/awk -f
  • 以上语句必须位于脚本文件的第一行
  • 通过以下命令执行awk程序:
./awk-script.awk   file
  • 例:
[root@server ~]# vim  awktest.awk       
#!/bin/awk -f                              # 注意:awk脚本解释器
/^$/{print  "This is a blank line."}
[root@server ~]# chmod +x awktest.awk    # 赋予执行权限
[root@server ~]# ./awktest.awk  input   # 执行awk脚本后跟上被处理的文件名
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.

四、awk命令的基本语法

1、格式

awk 'BEGIN{ commands } pattern{ commands } END{ commands }' [INPUTFILE…]
# 以上三部分可选

2、BEGIN模式与END模式

  • BEGIN模式是一种特殊的内置模式,其执行的时机为awk程序刚开始执行,但是又尚未读取任何数据之前。因此,该模式所对应的操作仅仅被执行一次,当awk读取数据之后,BEGIN模式便不再成立。所以,用户可以将与数据文件无关,而且在整个程序的生命周期中,只需执行1次的代码放在BEGIN模式对应的操作中,一般用于打印报告的标题和更改内在变量的值

  • END模式是awk的另外一种特殊模式,该模式执行的时机与BEGIN模式恰好相反,它是在awk命令处理完所有的数据,即将退出程序时成立,在此之前,END模式并不成立。无论数据文件中包含多少行数据,在整个程序的生命周期中,该模式所对应的操作只被执行1次。因此,一般情况下,用户可以将许多善后工作放在END模式对应的操作中EN,一般用于打印总结性的描述或数值总和

[root@server ~]# awk  'BEGIN{print  "BEGIN...."} {print $0} END{print  "The End"}'  /etc/fstab 

3、awk的输出

  • 格式:
awk 'BEGIN{ commands } {print item1,item2,……} END{ commands }' [INPUTFILE…]
  • 各项目之间使用逗号隔开,而输出到屏幕时则以空格字符分隔
  • 输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,然后再输出;

五、记录和域

1、概念

  • awk认为输入文件是结构化的,awk将每个输入文件行定义为记录,行中的每个字符串定义为,域之间用空格,Tab键或其他符号进行分隔,分隔域的符号就叫做分隔符,默认为空格或tab
  • awk定义域操作符$来指定执行动作的域,域操作符$后面跟数字或变量来标识域的位置,每条记录的域从1开始编号,如$1表示第一个域 $0表示所有域

2、示例

# 准备示例文件
[root@server ~]# vim  awk1.txt
Li xiaoming xian 13311111111
zhang cunhua bapji 133222222222
wang xiaoer xianyang 13333333333
[root@server ~]# awk '{print  $0}' awk1.txt  # 打印所有列(域)
Li xiaoming xian 13311111111
zhang cunhua bapji 133222222222
wang xiaoer xianyang 13333333333
[root@server ~]# awk '{print  $1}' awk1.txt
Li
zhang
wang
[root@server ~]# awk '{print  $2}' awk1.txt
xiaoming
cunhua
xiaoer
[root@server ~]# awk '{print  $3}' awk1.txt
xian
bapji
xianyang
[root@server ~]# awk '{print  $4}' awk1.txt
13311111111
133222222222
13333333333
[root@server ~]# awk  'BEGIN{one=1;two=2} {print  $(one+two)}'  awk1.txt
xian
bapji
xianyang
# 查看本机IP
[root@server ~]# ip a | grep ens160 | awk '/inet/{print $2}'
# 查看内存剩余容量
[root@server ~]# free -m | awk  '/Mem/{print $4}'
# 查看开机挂载设备的文件系统
[root@server ~]# awk '/^[^#]/{print  $3}'  /etc/fstab
# 查看hosts文件的IP地址
[root@server ~]# awk  '{print  $1}'  /etc/hosts

3、使用-F参数指定域之间的间隔符

# 语法: awk  -F  "符号"  '/模式/{动作}'   文件名
# 查看本机所有账户的名称及UID
[root@server ~]# awk -F ":" '{print $1,$3}'  /etc/passwd

4、使用系统内置变量FS改变域分隔符

# 语法:awk  'BEGIN {FS="符号"} /模式/{动作}'  文件名
[root@server ~]# awk  'BEGIN{print $FS}'
# 输出账户的UID、GID
[root@server ~]# awk  'BEGIN{FS=":"} {print $3,$4}'  /etc/passwd

5、NR、NF、FILENAME变量

  • 概念
    • NR变量:表示记录数,即行数、行号
    • NF变量:表述·处理的域(列)数量
    • FILENAME变量:被处理的文件名
  • 示例
[root@server ~]# awk  '{print  NF,NR,$0} END{print  FILENAME}'  awk1.txt
4 1 Li xiaoming xian 13311111111
4 2 zhang cunhua bapji 133222222222
4 3 wang xiaoer xianyang 13333333333
awk1.txt
[root@server ~]# awk  '{print  "第",NR,"行","有",NF,"列" > "/root/t1.txt"}'  awk1.txt
[root@server ~]# cat t1.txt 1 行 有 4 列
第 2 行 有 4 列
第 3 行 有 4

六、awk的变量

1、概念

  • 与其他的程序设计语言一样,awk本身支持变量的相关操作,包括变量的定义和引用,以及参与相关的运算等。此外,还包含了许多内置的系统变量

  • 变量的作用是用来存储数据。变量由变量名和值两部分组成,其中变量名是用来实现变量值的引用的途径,而变量值则是内存空间中存储的用户数据

  • awk的变量名只能包括字母、数字和下划线,并且不能以数字开头。例如abc、a_、_z以及a123都是合法的变量名,而123abc则是非法的变量名。另外,awk的变量名是区分大小写的,因此,X和x分别表示不同的变量

  • awk中的变量类型分为两种,分别为字符串和数值。但是在定义awk变量时,毋需指定变量类型,awk会根据变量所处的环境自动判断。如果没有指定值,数值类型的变量的缺省值为0,字符串类型的变量的缺省值为空串

2、内置变量

变量作用
$0记录变量,表示所有域
$n字段变量,表示第n个域
NF当前记录的域个数
NR显示每一行的行号
FS输入字段分隔符,默认值是空格或者制表符,可使用-F指定分隔符
OFS输出字段分隔符 ,OFS=”#”指定输出分割符为#
RS记录分隔符,默认值是换行符 \n
ENVIRON当前shell环境变量及其值的关联数组

3、示例

  • 准备示例文件
[root@server ~]# vim  awk2.txt
zhangsan 68 88 92 45 71
lisi     77 99 63 52 84
wangwu   61 80 93 77 81
  • 例1
[root@server ~]# vim  test.awk
{printprint "$0:",$0print "$1:",$1print "$2:",$2print "NF:",NFprint "NR:",NRprint "FILENAME:",FILENAME
}       
# 使用awk命令调用脚本执行
[root@server ~]# awk  -f  test.awk  awk2.txt
zhangsan 68 88 92 45 71
$0: zhangsan 68 88 92 45 71
$1: zhangsan
$2: 68
NF: 6
NR: 1
FILENAME: awk2.txt
lisi     77 99 63 52 84
$0: lisi     77 99 63 52 84
$1: lisi
$2: 77
NF: 6
NR: 2
FILENAME: awk2.txt
wangwu   61 80 93 77 81
$0: wangwu   61 80 93 77 81
$1: wangwu
$2: 61
NF: 6
NR: 3
FILENAME: awk2.txt
  • 例2
[root@server ~]# awk  -F ":"  'BEGIN{OFS="\t"} {print $1,$2}'  /etc/passwd
  • 例3:
# 面试题:打印/etc/sos/sos.conf中所有的空白行的行号
[root@server ~]# awk  '/^$/{print  NR}'  /etc/sos/sos.conf 

4、用户自定义变量

  • awk允许用户自定义自己的变量以便在程序代码中使用

  • 变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头

  • awk变量名称区分字符大小写

[root@server ~]# awk  'BEGIN{test="hello world" ; print test}' # 变量定义在BEGIN中
hello world
[root@server ~]# awk  -v test="hello world"  BEGIN'{ print test}' # 变量定义在-V参数后
hello world

七、awk操作符

  • awk是一种编程语言环境,因此,它也支持常用的运算符以及表达式,例如算术运算、逻辑运算以及关系运算等

1、算术运算符

+  -  *  /  %  ^(指数)  **(指数)
  • 示例
[root@server ~]# awk  'BEGIN{x=2;y=3;print  x+y,x-y,x*y,x/y,x^y,x**y}'
5 -1 6 0.666667 8 8
# 面试题:统计某目录下的文件占用存储空间字节数
[root@server ~]# ll /root | awk  'BEGIN{size=0} {size=size+$5} END{print size/1024,"KB"}'

2、赋值运算符

  • 符号
=  +=  /=  *=  %=  ^=
  • 示例
[root@server ~]# awk  'BEGIN{a=5;a+=5;print  a}'
10
[root@server ~]# awk  'BEGIN{a=5;a*=3+2;print  a}'
25

3、条件运算符

  • 格式
条件表达式?表达式1:表达式2
  • 条件运算符是一个三目运算符,条表成立,则表达式1为最终结果否则表达式2为最终结果

[root@server ~]# vim  awk2.txt
zhangsan 68 88 
lisi     77 99 
wangwu   61 80 
[root@server ~]# awk  '{max=$2>$3?$2:$3 ; print NR,"max=",max}'  awk2.txt 
1 max= 88
2 max= 99
3 max= 80

4、逻辑运算符

  • 符号
&&   ||   !

5、关系运算符

  • 符号:
>   <   >=   <=  ==  !=   ~(匹配)    !~(不匹配)
  • 示例
# 查询/etc/passwd文件中第三列小于10以下的信息,仅列出账户与uid
[root@server ~]# awk  -F  ":"  '$3<10{print  $1 , $3}'  /etc/passwd
# 查看ip地址
[root@server ~]# ifconfig ens160 | awk  'NR==2{print $2}'

6、其它运算符

++  --  +  -  等
[root@server ~]# awk  'BEGIN{a=0 ; print a++ , ++a }'
0 2
# 注意:awk变量为字符串变量时参与了算术操作,其值自动转为数值0
[root@server ~]# awk  'BEGIN{a="china" ; print a++ , ++a }'
0 2
[root@server ~]# awk  'BEGIN{a="ABABABAB" ; print a++ , ++a }'
0 2
[root@server ~]# awk  '{++count ; print  $0} END{print  "账户数:" , count}'  /etc/passwd
# 注意:count未赋初值参与算术运算时数值自动转为0

八、awk的模式

  • awk支持关系表达式、正则表达式、混合模式、BEGIN模式、END模式等

1、关系表达式

  • 新建示例文件
[root@server ~]# vim  awk3.txt
liming 85
wangwei 99
zhangsan 68
[root@server ~]# awk  '$2>80{print }'  awk3.txt

2、正则表达式

  • 与sed一样awk的正则表达式必须放置在两个/之间(/正则表达式/)
[root@server ~]# awk  '/^l/{print}'  awk3.txt 
liming 85
[root@server ~]# awk  '/^l|z/{print}'  awk3.txt 
liming 85
zhangsan 68
[root@server ~]# 
[root@server ~]# awk  '/root/{print}'  /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3、混合模式

  • awk支持关系表达式或正则表达式,还支持逻辑运算符&&、|| 、!组成的混合表达式
[root@server ~]# awk  '/^l/ &&  $2 > 80 {print}'  awk3.txt
liming 85

4、BEGIN模式与END模式

九、awk控制语句

1、if语句

  • 格式:与C语言类似
if (expression)
{语句1语句2……
}
else
{语句3语句4……
}
  • 示例
[root@server ~]# vim  if.awk
#!/bin/awk  -f
{if($2>=90){print  "优秀"}       else{if($2>=80){print  "良好"}else{if($2>=60){print  "及格"}       else{print  "补考"}       }       }       
}       
[root@server ~]# chmod  +x  if.awk 
[root@server ~]# ./if.awk  awk3.txt
良好
优秀
及格
[root@server ~]# cat   awk3.txt
liming 85
wangwei 99
zhangsan 68
# 输出UID小于GID的账户名
[root@server ~]# awk  'BEGIN{FS=":"} {if($3<$4)  print $1}'  /etc/passwd
adm
lp
mail
games
ftp
# UID为奇数的账户名
[root@server ~]# awk  'BEGIN{FS=":"} {if($3%2==1)  print $1}'  /etc/passwd
# UID为偶数,但小于20的账户名
[root@server ~]# awk  'BEGIN{FS=":"} {if($3%2==0 && $3<20)  print $1}'  /etc/passwd
# uid包含9的账户名
[root@server ~]# awk  'BEGIN{FS=":"} {if($3~9)  print $1}'  /etc/passwd
# 面试题:
1.查询cpu占用率大于指定数值的信息
[root@server ~]# ps  -eo  user,pid,pcpu,comm |  awk  '{if($3>0) print}'
2.统计系统账户数(UID小于1000的为系统账户,其它为普通账户)
[root@server ~]# awk  -F  ":"  '{if($3<1000) {x++} else {y++}} END{print  "系统账户数:",x,"\n","普通账户数:",y}'  /etc/passwd
系统账户数: 35 普通账户数: 2

2、fox循环

  • 格式与c语言格式相同

[root@server ~]# awk  'BEGIN{for(i=1;i<=100;i++) {sum=sum+i} ; print "sum=",sum}'
sum= 5050

3、while循环

  • 格式1
while(expression)
{循环语句1循环语句2……
}
  • 格式2
do{循环语句1循环语句2……
}while(expression)
[root@server ~]# awk  'BEGIN{while(i<=100) {sum+=i ; i++} ; print  "sum=",sum}'
sum= 5050

4、break、continue语句

5、next语句

  • next语句并不是用在循环结构中,而是用于awk整个执行过程中,当awk程序执行时,若遇到next语句则提前结束本行处理,会继续读取下一行
[root@server ~]# awk  -F  ":"  '{if($3%2==0)  next ; print  $1}'  /etc/passwd

6、exit

  • 作用:终止awk程序执行

十、格式化输出

1、格式

  • 与c语言格式相同

  • printf("format\n",输出列表项)  
    

2、format

  • format是一种控制输出格式的字符串,以%开头,后跟上一个字符,如:
%c:字符
%d,%i:十进制整数
%u:无符号整数
%f:浮点数
%e,%E:科学计数法
%s:字符串
%%:显示一个%
  • format说明符有修饰符
N:数字
-:左对齐
+:显示数值符号

3、注意

  • printf语句不会打印\n
  • 字符串一般使用双引号作为定界符

4、示例

[root@server ~]# awk  'BEGIN{printf("%d,%c\n","A",97)}'
0,a
[root@server ~]# awk  'BEGIN{printf("%5d\n",12345)}'
12345
[root@server ~]# awk  'BEGIN{printf("%2d\n",12345)}'
12345
[root@server ~]# awk  'BEGIN{printf("%5d\n",12)}'12
[root@server ~]# awk  'BEGIN{printf("%-5d\n",12)}'
12   
[root@server ~]# awk  'BEGIN{printf("%10.2f\n",123.4567)}'123.46
[root@server ~]# awk  'BEGIN{printf("%5.2f\n",123.4567)}'
123.46
[root@server ~]# awk  'BEGIN{printf("%.2f\n",123.4567)}'
123.46
[root@server ~]# awk  'BEGIN{printf("%E\n",123.4567)}'
1.234567E+02
[root@server ~]# awk  -F  ":"  '{printf("%-20s%d\n",$1,$3)}'  /etc/passwd
# 面试题:计算本机内存的占用率%
[root@server ~]# free | awk 'NR==2{printf("内存利用率:%%%.2f\n",($3/$2)*100)}'

十一、awk数组

1、索引数组

  • 索引数组以数字作为下标

  • 通过数组的下标(索引)引用数组中所有元素,下标一般从0开始

  • 例:

[root@server ~]# awk  'BEGIN{a[0]="a" ; a[1]="b" ; a[2]="c" ; a[3]="d" ; print  a[0],a[1],a[2],a[3]}'
a b c d
  • awk数组中元素若为空串,是合法的,注意:空串不是空
[root@server ~]# awk  'BEGIN{a[0]="a" ; a[1]="" ; a[2]="c" ; a[3]="d" ; print  a[0],a[1],a[2],a[3]}'
a  c d
  • 当一个元素不存在于数组时,此时若引用该数值,awk会自动创建该元素,值为空串
[root@server ~]# awk  'BEGIN{a[0]="a" ; a[1]="b" ; a[2]="c" ; a[3]="d"  ; print  a[0],a[1],a[2],a[3],a[4]}'
a b c d 

2、关联数组

  • 原则:数组的索引以字符串作为下标
[root@server ~]# awk  'BEGIN{a["zero"]="a" ; a["one"]="b" ; a["two"]="c" ; a["three"]="d" ; print  a["zero"],a["one"],a["two"],a["three"]}'
a b c d
  • 注意:
    • awk数组本质是一种使用字符串作为下标的关联数组
    • awk数组中的数字下标最终会转为字符串

3、循环遍历数组

  • 格式1
for(初始化;条件表达式;步长)
{循环体语句
}
  • 格式2
for(变量  in  数组)
{循环体语句
}
  • 例1:利用for循环变量i与数组下标都是数字的这一特征,按顺序输出数组元素
[root@server ~]# awk  'BEGIN{a[0]="a";a[1]="b";a[2]="c";a[3]="d"; for(i=0;i<4;i++) {print  i,a[i]}}'
0 a
1 b
2 c
3 d
  • 例2:数组中下标为字符串,且无规律则使用for循环的in方式访问,输出内容为无序状态
[root@server ~]# awk  'BEGIN{a["zero"]="a" ; a["one"]="b" ; a["two"]="c" ; a["three"]="d" ; for(i in a) {print  i,a[i]}}'
three d
two c
zero a
one b
  • 注意:awk数组本质是一种“关联数组”,默认打印的顺序是无序的,例1中时借助for循环中循环变量i的值实现输出有序的,由于i的值是数值并递增的,且刚好与数组下标相等,则使得使用数值作为数组下标时,for循环访问是按一定顺序的。

4、利用数组统计字符串出现次数

  • awk中可以利用数值进行运算,如:
[root@server ~]# awk  'BEGIN{a=1;print  ++a}'
2
  • 变量值为字符串的自增运算
[root@server ~]# awk  'BEGIN{a="test" ; print  a,++a}'
test 1
  • 注意
    • awk中字符串参与算术运算时会被当做数值0
    • 当引用一个不存在的数组元素时,该元素被赋值为空字符串,若该空字符串参与算术运算会被当做数值0
  • 例1:统计文本中IP出现次数
# 准备文本
[root@server ~]# vim  iptest.txt
192.168.48.1
192.168.48.2
192.168.48.5
192.168.48.1
192.168.48.3
192.168.48.1
192.168.48.5
192.168.48.2
192.168.48.4
192.168.48.1
[root@server ~]# awk  '{count[$1]++} END{ for(i in count) {print i,"次数:",count[i]}}'  iptest.txt 
192.168.48.1 次数: 4
192.168.48.2 次数: 2
192.168.48.3 次数: 1
192.168.48.4 次数: 1
192.168.48.5 次数: 2
  • 分析

    • 创建一个count数组,并将文件中ip地址行作为元素的下标,所以执行第一行时,引用的数组为count[“192.168.48.1”]
    • count[“192.168.48.1”]++相当于存储的数据为0并自增1
    • 继续下一行处理,运算过程同上
    • 当再次遇到192.168.48.1IP地址时,会使用上一次的数组存储数据参与自增运算
    • 直到所有行遍历结束,执行END模式完成打印
  • 例2:查看服务器连接状态并汇总

[root@server ~]# netstat  -an  |  awk  '/^tcp/{++s[$NF]} END{for(i in s) {print  i,s[i]}}'
LISTEN 8
ESTABLISHED 2
  • 分析
    • netstat -an:查看连接
    • /^tcp/ : 通过正则过滤
    • $NF:过滤结果的第6行

十二、实战

<1>输出当前系统所有用户的UID# awk –F :’{print $3}’ /etc/passwd
注释:-F :指定分隔符为:$3指定第三段
<2>输出当前系统所有用户的UID,在首行加入UserUid:
# awk -F : 'BEGIN{print "UserUid"}{print $3}' /etc/passwd
<3>输出当前系统shell为/bin/bash的用户名,在最后一行加入END That is last line!!!
# awk -F : /bash$/'{print $1}END{print "END That is last line!!!"}'
/etc/passwd
<4>输出当前系统上GID为0的用户的用户名
# awk -F : '$4==0{print $1}' /etc/passwd
<5>输出当前系统上GID大于500的用户的用户名
# awk -F : '$4>500{print $1}' /etc/passwd
<6>输出当前系统上的所有用户名和UID,以“ # # ”为分隔符
# awk -F: 'OFS=" # # "{print $1,$3}' /etc/passwd
<7>输出/etc/passwd文件中以“:”为分隔符的最后一段。
# awk -F: '{print $NF}' /etc/passwd
<8>对/etc/passwd文件中输出的每一行计数
# awk '{print NR,$0}' /etc/passwd
<9>对/etc/passwd、/etc/fstab文件中输出的每一行分别计数。
# awk '{print FNR,$0}' /etc/passwd /etc/fstab
<10>自定义变量
# awk -v var="Linux.com.cn" BEGIN'{print var}'
<11>以printf格式输出用户名,UID、GID
# awk -F: '{printf "%-15s %d %8i\n",$1,$3,$4}' /etc/passwd
<12>检测当前系统上所有用户,如果用户名为root输出:Admin
如果用户名不为root输出:Common User
# awk -F: '{if ($1=="root") printf "%-15s: %s\n", $1,"Admin"; else printf
"%-15s: %s\n", $1, "Common User"}' /etc/passwd
<13> 统计当前系统上UID大于500的用户的个数
# awk -F: -v sum=0 '{if ($3>=500) sum++}  END{print sum}' /etc/passwd
<14>读取/etc/passwd文件中的每一行的每一个字段,输出每个字段中字符个数大于等于四的字段。
# awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}'
/etc/passwd
<15>使用do-while语句输出/etc/passwd中每一行中的前三个字段
# awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd
<16>使用for语句输出/etc/passwd中每一行中的前三个字段
# awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd
<17>统计/etc/passwd文件中各种shell的个数
# awk -F: '$NF!~/^$/{BASHsum[$NF]++}END{for(A in BASHsum){printf
"%-15s:%i\n",A,BASHsum[A]}}' /etc/passwd
注释:$NF!~/^$/:最后一个字段非空BASHsum[$NF]++:最后一个字段相同的加一
<18> 显示当前系统上UID号为偶数的用户名和UID
# awk -F: '{if($3%2==1) next;{printf "%-15s%d\n",$1,$3}}' /etc/passwd
<19> 统计当前系统上以tcp协议工作的各端口的状态数
# netstat -ant | awk '/^tcp/ {++STATE[$NF]} END {for(a in STATE) print a,
STATE[a]}'
<20>输出/etc/passwd中的每一行以||||隔开,默认不换行
# awk -F: 'BEGIN{ORS="||||"}{print $0}' /etc/passwd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/102387.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 20.04 网卡命名规则

Ubuntu 系统中网卡的命名规则是&#xff1a;Consistent Network Device Naming&#xff08;一致网络设备命名&#xff09;规范。这个规范的原理是根据固件、拓扑和位置信息分配固定名称。其中&#xff0c;设备类型 en 代表 Ethernet (以太网)&#xff0c;wl 代表 WLAN&#xff…

mysql 大表如何ddl

大家好&#xff0c;我是蓝胖子&#xff0c;mysql对大表(千万级数据)的ddl语句&#xff0c;在生产上执行时一定要千万小心&#xff0c;一不小心就有可能造成业务阻塞&#xff0c;数据库io和cpu飙高的情况。今天我们就来看看如何针对大表执行ddl语句。 通过这篇文章&#xff0c;…

华为OD机试 - 二维伞的雨滴效应(Java JS Python)

题目描述 普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。 1、为了模拟伞状雨滴效应,用二叉树来模拟二维平面伞(如下图所示),现在输…

TLS协议深度解析:挖掘现代网络安全防御的底层技术

正常简单的通讯 1、服务器生成一对密钥&#xff0c;公钥A、私钥A 2、浏览器请求服务器时&#xff0c;服务器把公钥A传给浏览器 3、浏览器随机生成一个对称加密的密码S&#xff0c;用公钥A加密后传给服务器 4、服务器接收后&#xff0c;用私钥A解密&#xff0c;得到密钥S 5、浏…

2023年高教社杯数学建模国赛 赛题浅析

2023年国赛如期而至&#xff0c;为了方便大家尽快确定选题&#xff0c;这里将对赛题进行浅析&#xff0c;以分析赛题的主要难点、出题思路以及选择之后可能遇到的难点进行说明&#xff0c;方便大家尽快确定选题。 难度排序 B>A>C 选题人数 C>A>B (预估结果&…

qt作业day4

//clock_exercise.cpp#include "clock_timer.h" #include "ui_clock_timer.h"//时间事件处理函数 void Clock_Timer::timerEvent(QTimerEvent *event) {if(event->timerId() time_id){sys_tm QDateTime :: currentDateTime(); // int year sy…

基于Python开发的DIY字符画程序(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的DIY字符画程序&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&…

uniapp的小程序中使用web-view进行相互传参,并监听web-view的返回键

uniapp的小程序中使用web-view进行相互传参&#xff0c;并监听web-view的返回键 一、unaipp给webview传参 //uniapp页面中 <web-view :src"src" message"getMessage" onPostMessage"getPostMessage"></web-view>data() {return …

css3对文字标签不同宽,不同高使用瀑布流对齐显示

<div class"wrapper" style"padding: 0;"><span class"wf-item task-tags text-center" v-for"(item,index) in data.categorys" :key"index">{{ item }}</span> </div>/* 名称瀑布流显示 */ .wrap…

Ansible学习笔记15

1、roles&#xff1a;&#xff08;难点&#xff09; roles介绍&#xff1a; roles&#xff08;角色&#xff09;&#xff1a;就是通过分别将variables&#xff0c;tasks及handlers等放置于单独的目录中&#xff0c;并可以便捷地调用他们的一种机制。 假设我们要写一个playbo…

高忆管理:六连板捷荣技术或难扛“华为概念股”大旗

在本钱商场上名不见经传的捷荣技术&#xff08;002855.SZ&#xff09;正扛起“华为概念股”大旗。 9月6日&#xff0c;捷荣技术已拿下第六个连续涨停板&#xff0c;短短七个生意日&#xff0c;股价累积涨幅逾越90%。公司已连发两份股票生意异动公告。 是炒作&#xff0c;还是…

字节一面:css选择器有哪些?优先级?哪些属性可以继承?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;作为一名前端开发工程师&#xff0c;css是我们的必备技能&#xff0c;熟悉css选择器以及继承是我们写好css的关键&#xff0c;博主在这给大家细细道来。 &#x1f680; 作者…