[转帖]Shell三剑客之awk

shell,三剑客,awk · 浏览次数 : 0

小编点评

# 生成内容时需要带简单的排版 **1. 排版工具选择** * **awk**:默认工具,可用于各种操作。 * **Python**:可用于各种操作,可用于库的调用。 * **Java**:可用于各种操作,可用于库的调用。 **2. 排版代码** * **awk**: ```awk print "内容1" print "内容2" ``` * **Python**: ```python print("内容1") print("内容2") ``` * **Java**: ```java public class PrintContent { public static void main(String[] args) { System.out.print("内容1"); System.out.print("内容2"); } } ``` **3. 排版代码排版** * **awk**: ```awk print "内容1" print "内容2" print "内容3" ``` * **Python**: ```python print("内容1") print("内容2") print("内容3") ``` * **Java**: ```java public class PrintContent { public static void main(String[] args) { System.out.print("内容1"); System.out.print("内容2"); System.out.print("内容3"); } } ``` **4. 排版效果** * 排版后,内容将按照排版顺序排列。 * 可以通过控制台或其他工具查看排版结果。 **5. 排版注意事项** * 排版代码需要根据具体需求进行调整。 * 排版结果可能与实际结果不同。 **6. 排版示例** * **awk**: ```awk print "内容1" print "内容2" print "内容3" ``` * **Python**: ```python print("内容1") print("内容2") print("内容3") ``` * **Java**: ```java public class PrintContent { public static void main(String[] args) { System.out.print("内容1"); System.out.print("内容2"); System.out.print("内容3"); } } ```

正文


awk简述

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。
AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互 的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

awk的工作过程

第一步:执行BEGIN{action;… }语句块中的语句。

第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

第三步:当读至输入流末尾时,执行END{action;…}语句块。

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中

END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

awk的工作原理

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。
awk 执行结果可以通过 print 的功能将字段数据打印显示

awk的基本格式及其内置变量

awk 选项 ‘模式或条件 {操作}’ 文件1 文件2…

-F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
-v(小v) var=value 变量赋值

注意一定是单引号:‘模式或条件 {操作}’
{ }外指定条件,{ }内指定操作。
用逗号指定连续的行,用 || 指定不连续的行。&&表示”且“。
内建变量,不能用双引号括起来,不然系统会把它当成字符串。

内置变量
$0:	当前处理的行的整行内容 
$n:	当前处理行的第n个字段(第n列)
NR:	当前处理的行的行号(序数)
NF:	当前处理的行的字段个数。$NF代表最后一个字段
FS:	列分割符。指定每行文本的字段分隔符,输入内容的分隔符,
默认为空格或制表位。与"-F"作用相同 用-F可以不加单引号 -F:,用FS必须用=""
OFS:输出内容的列分隔符
FILENAME:被处理的文件名
RS:	行分隔符。awk从文件中读取资料时,
将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是"\n"

    在这里插入图片描述
    0和1放置{ }前,能够起到限制打印内容的作用(默认为"1"),如果为0,就不打印内容
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    getline

    getline的工作过程

    1、当getline左右无重定向符号(“<”)或者管道符号(“|”)时,awk首先读取的是第一行,而getline获取的是光标跳转至下一行的内容(也就是第二行)。

    2、当getline左右有管道符号或重定向符时,getline则作用定向输入文件,由于文件是刚打开,并没有被awk读入一行,而只是getline读入,所以getline返回的是文件的第一行,而不是跳转至一行输入。

    原因:getline运行之后awk会改变NF,NR,$0,FNR等内部变量,所以此时读取$0的行号不再为1,而是2。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    把ls的输出传递给getline函数,line是变量 把ls的内容输出给变量,然后打印出结果,如果无内容,不做任何操作

    文本内容匹配过滤打印

    在这里插入图片描述

    BEGIN打印模式:
    格式:awk ‘BEGIN{…};{…};END{…}’ 文件
    处理过程:
    1、在awk处理指定的文本之前,需要先执行BEGIN{…}模式里的命令操作
    2、中间的{…} 是真正用于处理文件的命令操作
    3、在awk处理完文件后才会执行END{…}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句。

    在这里插入图片描述

    对字段进行处理打印

    在这里插入图片描述

    -v的用法:变量赋值

    在这里插入图片描述
    fs的是:然后使用-v给FS赋值=:,输入的时候FS是:,-v给OFS赋值输出的时候变量为+,然后打印第一列和第三列

    条件判断打印

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    awk的三元表达式与精准筛选用法

    awk的三元表达式继承了java的用法,格式与Java相似

    格式:awk ‘(条件表达式)?(A表达式或者值):(B表达式或者值)’

    在这里插入图片描述

    awk的精准筛选:

    $n(> < ==):  用于对比数值
    $n~"字符串": 代表第n个字段包含某个字符串
    $n!~"字符串": 代表第n个字段不包含某个字符串
    $n=="字符串": 代表第n个字段为某个字符串
    $n!="字符串": 代表第n个字段不为某个字符串
    $NF: 代表最后一个字段
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    在这里插入图片描述

    awk的分隔符用法

    RS 指定行分隔符:
    awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录,
    而awk一次仅读入一条记录进行处理。内置变量RS的预设值是"\n" 也就是换行。
    也可以使用BEGIN模式在操作前进行行分隔符的改变
    在这里插入图片描述

    指定输出的分隔符

    OFS:输出内容的列分隔符。

    ($n=$n用于激活,否则不生效,n必须存在)
    
    • 1

    在这里插入图片描述

    awk结合数组运用

    awk中定义数组打印:
    在这里插入图片描述
    awk中的数组形成遍历
    在这里插入图片描述

    面试题

    监控内存脚本(当内存使用率>90%就报警)

    Mem_total=$(free -m | grep -w Mem | awk '{print $2}')
    Mem_used=$(free -m | grep -w Mem | awk '{print $3}')
    

    a=\((</span><span class="token builtin class-name">echo</span> <span class="token string">"scale=2;(<span class="token variable">\)Mem_used/$Mem_total)*100"|bc)
    Mem=</span><span class="token builtin class-name">echo</span> $a<span class="token operator">|</span><span class="token function">awk</span> -F. <span class="token string">'{print $1}'</span><span class="token variable">
    if [ \(Mem</span> -gt <span class="token number">90</span> <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token builtin class-name">echo</span> <span class="token string">"内存使用超过90%,请清理内存"</span> <span class="token keyword">else</span> <span class="token builtin class-name">echo</span> <span class="token string">"系统安全,请放心使用,内存使用情况:<span class="token variable">\)Mem%"
    fi

      监控CPU使用情况脚本

      top -b -n 1 | awk 'NR==3{print}'| awk '{print "目前CPU的使用情况:"$2+$4}'
      
      • 1

      监控磁盘使用情况脚本(当磁盘使用率>90%就报警)

       a=$(df -T | awk 'NR==2{print}' | awk '{print $4}')
      

      b=$(df -T | awk 'NR==2{print}' | awk '{print \(5}'</span><span class="token variable">)</span></span> <span class="token assign-left variable">c</span><span class="token operator">=</span><span class="token variable"><span class="token variable">\)(echo "scale=2;(\(a</span>/<span class="token variable">\)b)*100"|bc)

      sum=</span><span class="token builtin class-name">echo</span> $c <span class="token operator">|</span><span class="token function">awk</span> -F. <span class="token string">'{print $1}'</span><span class="token variable">
      if [ \(sum</span> -gt <span class="token number">90</span> <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token builtin class-name">echo</span> <span class="token string">"磁盘使用超过90%,请清理磁盘"</span> <span class="token keyword">else</span> <span class="token builtin class-name">echo</span> <span class="token string">"系统安全,请放心使用,磁盘使用情况:<span class="token variable">\)sum%"
      fi

        文章知识点与官方知识档案匹配,可进一步学习相关知识
        云原生入门技能树首页概览12816 人正在系统学习中

        与[转帖]Shell三剑客之awk相似的内容:

        [转帖]Shell三剑客之awk

        目录 awk简述awk的工作过程awk的工作原理awk的基本格式及其内置变量getline文本内容匹配过滤打印对字段进行处理打印条件判断打印awk的三元表达式与精准筛选用法awk的精准筛选:awk的分隔符用法指定输出的分隔符awk结合数组运用面试题 awk简述 在 Linux/UNIX 系统中,aw

        [转帖]Shell三剑客之sed

        目录 Shell三剑客sed工具sed 流编辑器的工作过程sed命令格式与选项操作符sed命令的常用选项sed命令的打印功能默认打印方式sed命令的寻址打印文本模式过滤行内容 sed的删除操作通过行号进行删除匹配字符串内容删除字符串搭配正则进行删除删除空行的三种方法 sed命令替换符进行大小写的替换

        [转帖]shell编程之循环语句

        目录 一、循环语句for循环for语句的结构嵌套循环 while语句的结构while语句应用示例 until语句的结构until语句示例 二、跳出循环continue跳出循环break跳出循环 三、常用循环脚本实例循环打印9*9乘法表数字累加脚本(1-100)常用转义字符购物shell 计算器正等腰

        [转帖]shell中1>&2、2>&1和&>filename重定向的含义和区别

        https://blog.yelvlab.cn/archives/414/ 在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是: 0 是一个文件描述符,表示标准输入(stdin) 1 是一个文件描述符,表示标准输出(stdout) 2 是一个文件描述符

        [转帖]Shell 中的 expect 命令

        https://www.cnblogs.com/chenjo/p/12892894.html 目录 expect 介绍 expect 安装 expect 语法 自动拷贝文件到远程主机 示例一 示例二 示例三 示例四 expect 介绍 借助 expect 处理交互的命令,可以将交互过程如 ssh 登

        [转帖]shell 把以空格分隔的变量 分割后的每个字段赋值给变量

        比如我有一个变量 “123 456 789”,要求以空格为分隔符把这个变量分隔,并把分隔后的字段分别赋值给变量,即a=123;b=456;c=789 共有3中方法: 法一:先定义一个数组,然后把分隔出来的字段赋值给数组中的每一个元素 法二:通过eval+赋值的方式 法三:通过多次awk把每个字段赋值

        [转帖]linux shell 脚本一些主要知识点整理

        文章目录 一、/bin/sh 与 /bin/bash 的区别二、vi与vim的区别三、shell变量四、Shell字符串五、Shell函数六、Shell基本运算符1、Shell expr:进行整数计算2、Shell (()):对整数进行数学运算3、Shell let:对整数进行数学运算4、Shell

        [转帖]Linux 学习记录四(Bash 和 Shell scirpt).

        https://www.cnblogs.com/jmcui/p/7194627.html 阅读目录 一、什么是 Shell? 二、Bash Shell 的基本操作技巧 三、Shell Script 回到顶部 一、什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗

        [转帖]shell带颜色的脚本

        https://www.cnblogs.com/fengzi7314/p/14139319.html 我们在写shell脚本的时候为了使输出出来的信息更加醒目一点,可以给不同状态的字体显示不同的颜色,如下: 我在这里最先定义了2个函数,log.info和log.err,一个输出正常信息为绿色,一个输

        [转帖]shell脚本循环查询数据库实现数据输出到csv

        https://blog.csdn.net/m0_46897923/article/details/125906115?spm=1001.2014.3001.5501 可以利用这个思路高点事情吧.. 一、shell脚本和数据文件 1.shell脚本 cat data.txt|while read l