shell三剑客之awk

1.awk的工作流程

在awk处理数据时,它会反复执行以下4个步骤:

(1)自动从指定的数据文件中读取行文本。

(2)自动更新awk的内置系统变量的值,例如列数变量NF、行数变量NR、行变量$0以及各个列变量 $1、$2等等。

(3)依次执行程序中所有的匹配模式及其操作。

(4)当执行完程序中所有的匹配模式及其操作之后,如果数据文件中仍然还有未读取的数据行,则返回 到第(1)步,重复执行(1)~(4)的操作。


2.awk程序的执行方式

1.通过命令行执行awk程序,语法如下: awk 'program-text' datafile

2.执行awk脚本 在awk程序语句比较多的情况下,用户可以将所有的语句写在一个脚本文件中,然后通过awk命令来解 释并执行其中的语句。

awk调用脚本的语法如下: awk -f program-file file .. 在上面的语法中,-f选项表示从脚本文件中读取awk程序语句,program-file表示awk脚本文件名称,file 表示要处理的数据文件。

3.可执行脚本文件

1.删除/etc/grub

2.conf文件中所有以空白开头的行行首的空白字符

3.awk打印一个内容和打印多个内容


格式化输出:显示Hello World字符串且宽度为50,向左对齐

[root@localhost test5]# awk -F: '{printf "%-50s %-50s",$1,$2}' one | head 
Hello                                              Word          


4.awk中所有内置变量的使用,以及自定义变量并使用

[root@localhost test5]# awk 'BEGIN{test="hello";print test}'
hello
[root@localhost test5]# awk -v test="hello" 'BEGIN {print test}'
hello
 


5.awk执行数学计算: 10/2*3+5%2+2^3

[root@localhost test5]# awk 'BEGIN{print 10/2*3+5%2+2^3 }'
24


awk处理文本:要求文本有5行内容,且当行数为奇数的时候打印第一个字段
awk处理文本: 要求文本有5行内容, 当行数不为3时打印第一个字段
awk处理文本:文本内容为ls -l /root的内容,匹配所有的普通文件的文件名


 

每个模式下加样例
BEGIN

[root@localhost test11]# cat 1.sh
#!/bin/awk -f
BEGIN {print "hello,world"}
[root@localhost test11]# ./1.sh
hello,world
[root@localhost ~]# awk -F: 'BEGIN {printf "%-15s %-3s%-15s\n","user","uid","shell"} $3==0,$7~"nologin" {printf "%-15s %-3s%-15s\n",$1,$3,$7}' /etc/passwd


END

[root@localhost test11]# cat 2.sh
#! /bin/awk -f
BEGIN {
print "scores report"
print "================================="
}
{ print }
END {
print "================================"
print "printing is over"
}
[root@localhost test11]# ./2.sh file
scores report
=================================
liming 80
wangmei 70
zhangsan 90
lisi 81
================================
printing is over
[root@localhost ~]# awk -F: 'BEGIN {printf "%-15s %-3s
%-15s\n","user","uid","shell"} $3==0,$7~"nologin" {printf "%-15s %-3s
%-15s\n",$1,$3,$7} END {print "-----End file-----"}' /etc/passwd


BEGINFILE
ENDFILE


/regular expression/
relational expression
pattern && pattern
pattern || pattern
pattern ? pattern : pattern
(pattern)
! pattern
pattern1, pattern2


7. awk中控制语句


if: 给定一个成绩0-100,输出等级: A:85-100, B:70-84, C:60-69, D:0-59

{
if ($2 >= 85) {
  print $1,"A"
  }
else
{
  if ($2 >=70 && $2 <84)
  {
    print $1,"B"
  }
  else
  {
    print $1,"C"
  }
 }
}

for(): 计算1+2...+100的和

#!/bin/awk -f
#########################
#File name:2.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-09-04 19:58:53
#Description:
#########################
{
  sum=0
  for(i=0;i<=100;i++)
  {
    $sum=$sum+i
  }
  print $sum
}

for(in): 定义一个数组:数组中的元素为: array[name]=age,-> zhangsan:18 lisi:20 wangwu=21
循环访问数组,并输出数组中的key和value

用while和do...while实现9*9乘法表

i=1
j=1
while (($i<10))
do
        while (($j<$i+1))
        do
                echo -n "$i*$j=$(($i*$j)) "
                let j++
        done
        let i++
        j=1
        echo -e
done


8.awk中内置函数的使用:substr, tolower, toupper, system

(1)substr(string, start [, length]) 功能:取string字符串中的子串,从start开始,取length个;start从1开始计数;

[root@localhost ~]#awk 'BEGIN{print substr("uplooking",u,2)}'

(2)tolower(s) 功能:将s中的所有字母转为小写

[root@localhost ~]# awk 'BEGIN{print tolower("WWW.baidu.COM")}'

(3)toupper(s) 功能:将s中的所有字母转为大写

[root@localhost ~]# awk 'BEGIN{print toupper("WWW.baidu.COM")}'

(4)system(command) 功能:执行系统command并将结果返回至awk命令

[root@localhost ~]# awk 'BEGIN{print system("whoami")}'
root
0 #系统命令执行之后的状态码


版权声明:本文为m0_63410395原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。