3天玩转shell--8.awk编程技巧二

简介: 本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。

一、这节课掌握如下几个知识点

【1】掌握awk数组的使用技巧
【2】掌握awk中BEGIN、END
【3】掌握awk的内置函数用法

二、代码讲解

本节的测试用例采用第7节的测试用例: 7.example.txt
#!/bin/bash
#8.sh v1
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export LANG=zh_CN.UTF-8
export PATH

#1.数组
awk 'BEGIN{a[0]="xiaohong";a[1]="xiaolan";for (i in a)print a[i]}' #初始化一个数组、并循环数组打印出来
echo "--------------"
awk -F: '{{a[NR]=$1}{print NR,a[NR];}}' /etc/passwd  #按照分号切割/etc/passwd之后将第一列存入数组,然后打印出来 
echo "--------------"
sed -n '29,34p' 7.example.txt
echo "--------------"
sed -n '29,34p' 7.example.txt|awk '{a[$1]+=$2}END{for(i in a){print i" "a[i]}}'  #将相同key[第一列]后的value[第二列]值相加,
echo "--------------"
sed -n '29,34p' 7.example.txt|awk '{a[$1]+=$2}END{for(i in a){print i" "a[i]}}'|sort -nr -k 2   #将相同key[第一列]后的value[第二列]值相加,并按照第二列进行排序

#2.BEGIN,END,next的用法
>awk中两个特别的表达式 任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。
echo "--------------"
cat /etc/passwd |awk 'BEGIN {FS=":";OFS="%"}{print $1,$5}'   #先在BEGIN后的{}定义输入时的分隔符:和输出的分隔符%,然后再进行打印
echo "--------------"
cat /etc/passwd |awk 'BEGIN {FS=":";OFS="#"} gsub(/root/,"admin",$1) {print $0}'  
 #先定义输入分隔符:和输出分隔符#,然后在匹配第一列包含root,然后将第一列的root替换为admin  
echo "--------------"
cat /etc/passwd |awk 'BEGIN {FS=":";OFS="#"} gsub(/root/,"admin") {print $1,$5}' #先定义输入分隔符:和输出分隔符#,然后在匹配全部包含root,然后将全部root替换为admin
echo "--------------"
sed -n '24,27p' 7.example.txt
echo "--------------"
sed -n '24,27p' 7.example.txt|awk '{N+=$1} END {print N}'  #先进行累加,累加完之后在END之后进行打印
echo "--------------"
sed -n '36,38p' 7.example.txt
echo "--------------"
sed -n '36,38p' 7.example.txt|awk 'BEGIN { FS=":";OFS="\t";print "产品\t销售额";total=0} {print $1,$2;total=total+$2;} END {printf "总计\t%.2f\n",total}'
#第一步:先定义输入分隔符:输出分隔符\t。同时定义变量total=0,并打印"产品\t销售额"
#第二步:逐行打印并循环累加 {print $1,$2;total=total+$2;} 
#第三步:执行完第二步之后打印结果:{printf "总计\t%.2f\n",total}

#3.next用法
awk '{if(NR==1){next} print $1,$2}'  #next相当于循环中的continue,该语句的意思是当等于第一行时,就继续下一次循环,不打印,其余的就打印第一列、第二列。

#4.awk内置函数
echo "123" | awk '{print length}'  #length 统计字符串长度
echo "123" | awk '{print substr($0,1,2)}' #substr 字符串切割从第N个字符开始往后M个字符substr(str,N,M)

#4.1system函数
awk 'BEGIN{b=system("ls -al");print b;}'  #将执行命令的结果返回给b,并打印出来

#4.2sub,gsub喊出 字符串替换
echo "Linux Os2020 is Good system" | awk '{sub(/20/,"88",$2);print}'  #将第二列第一次出现20替换成88
echo "Linux Os2020 is Good system" | awk '{gsub(/20/,"88",$2);print}' #将第二列全部出现的20替换成88
echo "Linux Os2020 is Good system"|awk '{gsub(/[0-9]+/,"",$0);print}'  #将全部匹配的连续数字进行替换为空
echo "Linux Os2020 is Good system"|awk '{gsub(/[0-9]+/,"",$2);print}'  #将第二列匹配的连续数字进行替换为空

#4.3 split喊出 字符串分隔返回一个数组
echo "15:32:43"| awk '{split($0,a,":");print a[1],a[2],a[3]}'  #将字符串分隔并赋予数组a中。

#4.4 index喊出 字符串查找
awk 'BEGIN{info="shell is a good22 tools,so good!";print index(info,"good")}'  #找到返回字符的位置12,否则返回0
awk 'BEGIN{info="shell is a good22 tools,so good!";print index(info,"good")?"yes":"no"}' #找到返回yes,否则返回no

#4.5match 正则表达式匹配查找
awk 'BEGIN{info="shell is a good2020 tools,so good!";print match(info,/[0-9]+/)}'          #找到数字部分,返回字符的位置16,否则返回0
awk 'BEGIN{info="shell is a good2020 tools,so good!";print match(info,/[0-9]+/)?"yes":"no"}'   #找到数字部分,找到返回yes,否则返回no 

#4.6 systime函数 中strftime汗水 将时间戳转日期
awk 'BEGIN{print strftime("%Y-%m-%d",systime())}'  #打印当前时间
echo "1435548542"|awk '{print strftime("%Y%m%d-%H%M%S",$1)}'  #时间戳转时间
awk 'BEGIN {printf("%d\n",mktime(2006" "8" "5" "15" "09" "0))}'  #将日期转为时间戳将06年8月15日转为时间戳

#4.7 asort,asorti排序函数
#【1】.asort  对value排序,不能保存key-value的关系
#【2】.asorti 对key排序,可以保存key-value的关系

sed -n '32,34p' 7.example.txt|awk '{a[$1]=$2}END{for(i in a) print i,a[i]}'  #awk是关联数组。for…in循环输出时候,默认打印出来是无序数组
sed -n '32,34p' 7.example.txt|awk '{a[$1]=$2}END{slen=asort(a,b);for(i=1;i<=slen;i++) print i,a[i],b[i]}'  #asort对a数组中的数字【value】进行排序然后存入b数组中,然后返回数组长度到slen,同时将a数组清空
sed -n '32,34p' 7.example.txt|awk '{a[$1]=$2}END{slen=asorti(a,b);for(i=1;i<=slen;i++) print i,b[i],a[b[i]]}' 
 #asorti对a数组中的字母【key】进行排序然后存入b数组中,然后返回数组长度到slen。再把数组b的值当作数组a的下标值打印数组a的值
相关文章
|
Shell Linux
Linux Shell 进阶:探索高级命令和脚本编程技巧
Linux Shell不仅仅是一个命令解释器,它还提供了许多强大的高级命令和脚本编程技巧,能够帮助用户更高效地管理系统和处理数据。在这篇文章中,我们将深入探讨Linux Shell的高级功能。
213 0
|
6月前
|
Shell Linux C语言
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
202 0
|
弹性计算 Shell Linux
3天玩转shell--10.shell编程技巧汇总
本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。
123 0
|
弹性计算 Shell Linux
3天玩转shell--7.awk编程技巧一
本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。
111 0
|
1月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
75 1
|
17天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
38 2
6种方法打造出色的Shell脚本
|
3天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
12 1
|
8天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
22 2
|
21天前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
43 6
|
18天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。