3天玩转shell--7.awk编程技巧一

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

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

【1】掌握awk的字符分隔
【2】掌握awk字符匹配的用法
【3】掌握awk流程控制的if判断
【4】掌握awk编程的循环for、while

二、代码讲解

先根据附件中的文档创建7.example.txt的测试文件。
#!/bin/bash
#7.sh v1
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export LANG=zh_CN.UTF-8
export PATH

#1.文件中某一列的字符提取及字符切割
#$0-$NF 从第一列到最后一列
sed -n '1,3p' 7.example.txt    #用sed将文件中的1到3行过滤出来
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print}'  #用sed将文件中的1到3行过滤出来并通过awk全部打印
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $0}' #用sed将文件中的1到3行过滤出来打印第1列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $1}'#用sed将文件中的1到3行过滤出来打印第2列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $2}' #用sed将文件中的1到3行过滤出来打印第3列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $NF}'#用sed将文件中的1到3行过滤出来打印最后一列
echo "=================-F 切割参数"
awk -F '[ :]' 表示既可以是空格,也可以是冒号进行分隔
sed -n '5,7p' 7.example.txt  #用sed将文件中的5到7行过滤出来
echo "--------------"
sed -n '5,7p' 7.example.txt|awk -F "," '{print $2}' #用sed将文件中的5到7行过滤出来并进行逗号切割后,打印第二列
echo "--------------NR 表示输入的行数"
sed -n '9,11p' 7.example.txt|awk -F ",|;" '{print $2}'#用sed将文件中的9到11行过滤出来并进行逗号,竖线,分号切割后,打印第二列
echo "--------------"
sed -n '9,11p' 7.example.txt|awk '{print NR}' #用sed将文件中的9到11行过滤出来并用awk输出行号

#2.字符串匹配
echo "=================="
sed -n '13,17p' 7.example.txt  #用sed将文件中的13到17行过滤出来
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '/yidong2/' #用sed将文件中的13到17行过滤出来,并将匹配yidong2的行打印出来
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '/yidong2/{print $2}' #用sed将文件中的13到17行过滤出来,并将匹配yidong2的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /10010/{print $2}' #用sed将文件中的13到17行过滤出来,并将第一列匹配到10010的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /\<10010\>/{print $2}' #用sed将文件中的13到17行过滤出来,并将第一列绝对匹配10010的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /10010/ && $NF ~ /liantong2/{print $2}' 
 #用sed将文件中的13到17行过滤出来,并将第一列匹配10010,和最后一列匹配liantong2的第二列打印出来

#3.awk中使用if判断
echo "=================="
sed -n '1,3p' 7.example.txt
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '$2>=30{print}'   #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行打印出来。
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '$2>=30{print $1,$2}'  #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行,然后将第一列、第二列打印出来。
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '($2>=30)&&($1~/wang/){print $3}' #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行,并且第一列匹配wang的行匹配出来并打印第三列
echo "--------------"
sed -n '19,22p' 7.example.txt
echo "--------------"
sed -n '19,22p' 7.example.txt|awk '{if (NR%2==0){print $0} else {printf "%s ",$0}}'   #用sed将文件中的19到22行过滤出来,并将偶数列和奇数列分别打印不同的信息
echo "--------------"
sed -n '24,27p' 7.example.txt|awk '{ if(NR==2){print $0/4} else if(NR==4){print $0/3} else {print} }'  #用sed将文件中的24到27行过滤出来,并将第二行的第一列除4,第四行的第一列除3,其余的全部打印。

#4.awk中使用循环for,while
echo 5 6 7 8|awk '{ for (i=1;i<=NF;i++) { if ($i>6) {print $i} } }'  #循环判断5678,并打印大于6的值
echo 5 6 7 8|awk '{for (i=1;i<=NF;i++) { sum+=$i }; {print sum} }'  #将5678求和
sed -n '24,27p' 7.example.txt|awk '{N+=$1} END {print N/NR}'  #用sed将文件中的24到27行过滤出来,并求第一列数据的平均数
sed -n '24,27p' 7.example.txt|awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1 fi} END {print max}'  #用sed将文件中的24到27行过滤出来,并求第一列的最大值
#awk默认按照字符串比较的,如果要比较数值,需要先强制类型转换,即 $1+0,转换成整数。
sed -n '24,27p' 7.example.txt|awk 'BEGIN {min = 65535} {if ($1+0 < min+0) min=$1 fi} END {print min}' #用sed将文件中的24到27行过滤出来,#求最小值
awk 'BEGIN{ test=100; total=0; while(i<=test) { total+=i;  i++; } print total; }' #求1-100的累加
awk 'BEGIN{ total=0; i=0; do { total+=i;  i++; }while(i<=100) print total; }'  #求1-100的累加

三、课程附件

附件1:7.example.txt

xiaoming 23 1500
xiaodong 32 2300
xiaowang 43 3200
===========
xiaoming,23,1500
xiaodong,32,2300
xiaowang,43,3200
===========
xiaowang,43;3200
xiaowang;43,3200
xiaowang,43,3200
=========ƥӡ=
10086 cmc yidong
100860 ccc yidong2
10010 cnc liantong
100101 ccc liantong2
10000 ctc dianxing
==========if һ=
192.168.1.17
down
192.168.1.103
open
=======if-else===
125
32
126
54
==========
cc 750
aa 181
bb 37
bb 725
aa 42
cc 72
=====BEGIN END====
one:16.32
two:13.28
three:15.65
相关文章
|
Shell Linux
Linux Shell 进阶:探索高级命令和脚本编程技巧
Linux Shell不仅仅是一个命令解释器,它还提供了许多强大的高级命令和脚本编程技巧,能够帮助用户更高效地管理系统和处理数据。在这篇文章中,我们将深入探讨Linux Shell的高级功能。
173 0
|
5月前
|
Shell Linux C语言
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
Linux中执行Shell的函数(popen,system,exec)介绍:分享一些常用的执行Shell的函数及其相关编程技巧和经验
143 0
|
弹性计算 Shell Linux
3天玩转shell--10.shell编程技巧汇总
本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。
122 0
|
弹性计算 Shell 测试技术
3天玩转shell--8.awk编程技巧二
本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。
125 0
|
16天前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
43 12
|
12天前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
21 2
|
20天前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
23天前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
38 2
|
6天前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
10 0
|
1月前
|
Shell
Shell脚本有哪些基本语法?
【9月更文挑战第4天】
48 17