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、如图

RHCE——十九、shell编程之awk_第1张图片

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
{
        print
        print "$0:",$0
        print "$1:",$1
        print "$2:",$2
        print "NF:",NF
        print "NR:",NR
        print "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

你可能感兴趣的:(RHCE,Linux,网络,服务器,网络协议,运维,前端,RHCE,linux)