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 #系统命令执行之后的状态码